Good points: powerful; allows you to:
- prescribe compile-time attributes and computation
- describe generic algorithms and datastructures
- do many other things that would otherwise be repetitive, boring, and mistake-prone
- does them in-language, without macros (which can be far more hazardous and obscure!)
Bad points: powerful; allows you to:
- provoke compile-time errors that are verbose, misleading, and obscure (though not as obscure and misleading as macros...)
- create obscure and hazardous misdesigns (though not as readily as macros...)
- cause code bloat if you're not careful (just like macros!)
Templates vastly increase the viable design space, which is not necessarily a bad thing, but it does make them that much harder to use well. Template code needs maintainters who understand not just the language features, but the design consequences of the language features; practically speaking, this means many developer groups avoid all but the simplest and most institutionalized applications of C++ templates.
In general, templates make the language much more complicated (and difficult to implement correctly!). Templates were not intentionally designed to be Turing-complete, but they are anyway -- thus, even though they can do just about anything, using them may turn out to be more trouble than it's worth.