"Programming that does programming": New age "Modern C++ Design" beyond OO Extreme Programming -speak for compile time generation of code, especially in C++. The usual technique there for metaprogramming is template meta-programming (see also discussion of a ubiquitous UN*X tool).

But there really is nothing new about metaprogramming! lex and yacc write (C) programs; they're not a pass of cc, but if you use make you don't really care about that. The C preprocessor also generates code, but that's really simple stuff. If you really wanted to, you could preprocess your C program with a more powerful macro processor (like M4), but most people are sensible enough not to try this.

But there's more to computing than C/C++! A good macro assembler contains a macro language powerful enough to express loops (the big selling point of C++ templates). And it even gives an orthogonal syntax, which templates don't (of course, assembler syntax is simpler than C++ syntax...).

Common Lisp's defmacro is more like it: you learned as a CS undergraduate that let is really just lambda, and that (delay expr) is really just a memoized (lambda () expr). In Lisp, you write a defmacro which does the required translations on the source code, giving a new list.

Scheme goes all the way with hygienic macros and syntax-rules: using a magical syntax that appears to write the let->lambda translation by example, and giving precise safe semantics for the translation.

Computer science has a tendency to give a new name to every concept existing elsewhere. With C++, computer science eats itself: it gives a new name to what it already has! Metaprogramming is the 90's name for 60's macro processing.