What can be achieved with metaprogramming that can't be achieved with an object-oriented framework with a good level of abstraction? Is it more efficient or is there some type of optimization?
Try to make a generic array sorting algorithm the object oriented way without templates and with templates. Then observe the difference. Templates offer a neat way of generalization. For every problem there may be some sort of a solution but the question is how will the code or the design look.