Table of Contents
Whenever I create a new C++ file using Emacs a simple elisp script executes. This script:
#include
guards (for header files),
In short, the script automates some routine housekeeping for me.
On the face of it, nothing extraordinary is going on here. One program (the elisp script) helps me write another program (the C++ program which needs the new file). This unremarkable elisp script – a program to write a program – is, then, a metaprogram.
This article investigates some other metaprograms which, perhaps, we don't really notice, and some alternative metaprogramming techniques which, perhaps, we should be aware of.
I like the definition found in the Wikipedia:
"Metaprogramming is the writing of programs that write or manipulate other programs (or themselves) as their data or that do part of the work that is otherwise done at runtime during compile time."
Actually, it's the first half of this definition I like (everything up to and including data). The second seems rather to weaken the concept by being too specific, and in my opinion its presence reflects the current interest in C++ template-metaprogramming – but a Wikipedia is bound to relect what's in fashion!
Having established what metaprogramming is the obvious follow-up is "Why?" Writing programs to manipulate ordinary data is challenging enough for most of us, so writing programs to manipulate programs must surely be either crazy or too clever by half.
Rather than attempt to provide a theoretical answer to "Why?" at this point, let's push the question on the stack and discuss some practical applications of metaprogramming.