I've never seen preprocessor use cause a problem with build tools. Using the preprocessor for certain types of code generation used to interact poorly with code completion and code browsing, but that's much less of a problem these days. With things like clang, the IDE/editor can just compile the code, and get the browsing/code completion data from the result. Modern versions of Visual Studio do something similar internally with the VC++ compiler.
(This is actually a bigger step forward than it might seem. You can now make good use of a few useful techniques that were previously worth avoiding because they didn't work with code completion or browsing.)
On the other hand, if you're creating a macro that consists of more than one statement, I've always thought you're much better off with templates. Even if the debugging experience isn't as good as it should be (e.g., the debugger doesn't know what template type T actually is, so you can't watch "(T *)p" and so on), you're pretty much guaranteed to be able to at least step through the code and look at the variables.
(This is actually a bigger step forward than it might seem. You can now make good use of a few useful techniques that were previously worth avoiding because they didn't work with code completion or browsing.)
On the other hand, if you're creating a macro that consists of more than one statement, I've always thought you're much better off with templates. Even if the debugging experience isn't as good as it should be (e.g., the debugger doesn't know what template type T actually is, so you can't watch "(T *)p" and so on), you're pretty much guaranteed to be able to at least step through the code and look at the variables.