boost contains a preprocessor metaprogramming libary. What this means, simply, is that it is possible to write code which generates code. The full docs are here.

It is possible to do full LISP-like lambda calculus with the library. That’s not, however, where my interests lie. For me, the practical use is to automatically generate a set of templates which take N arguments and let the compiler generate all of the N iterations for you.

Here is a simple example. Say you want a set of template functions which convert any set of objects into their string representations using the boost::lexical_cast library.

#include <boost/preprocessor.hpp>
#define rep(z, n, text) \ 
  a.push_back(lexical_cast<string>(x ## n);
#ifndef BOOST_PP_IS_ITERATING
# ifndef CONVERTOBJECTS_HPP
# define CONVERTOBJECTS_HPP
//0 object case

vector<string> convertObjsToStrings() { 
  return vector<string>(); 
}

#define BOOST_PP_ITERATION_LIMITS ( 1, 3)
#define BOOST_PP_FILENAME_1 "convertobjects.h"
#include BOOST_PP_ITERATE()
# endif
#else
# define n BOOST_PP_ITERATION()

template < BOOST_PP_ENUM_PARAMS(n, class A) >

vector<string> convertObjsToStrings(
  BOOST_PP_ENUM_BINARY_PARAMS(n, A, x ) 
)
{
    vector<string> a;
        BOOST_PP_REPEAT(n, rep, ~)
        return a;
}

#endif

In the above code we have a few very simple concepts. First, we see that the code is going to iterate 3 times with the line: #define BOOST_PP_ITERATION_LIMITS ( 1, 3).

Second, we see that the header file includes itself with the line: #define BOOST_PP_FILENAME_1 “convertobjects.h”.

Third, we accomplish the real work by iterating the rep macro define at the top of the file with the line: BOOST_PP_REPEAT(n, rep, ~)

This probably seems pretty abstract if you are anything like me. Below is the output from the C++ preprocessor, to show you the code that is generated:

template < class A0 >
vector<string> convertObjsToStrings( A0 x0 )
{
    vector<string> a;
 a.push_back(lexical_cast<string>(x0);
 return a;
}

template < class A0 , class A1 >

vector<string> convertObjsToStrings( A0 x0 , A1 x1 )
{
    vector<string> a;
 a.push_back(lexical_cast<string>(x0);
 a.push_back(lexical_cast<string>(x1);
 return a;
}

template < class A0 , class A1 , class A2 >
vector<string> convertObjsToStrings( A0 x0 , A1 x1 ,
    A2 x2 )
{
    vector<string> a;
 a.push_back(lexical_cast<string>(x0);
 a.push_back(lexical_cast<string>(x1);
 a.push_back(lexical_cast<string>(x2);
 return a;
}

Of course you can increase the number of allowed parameters pretty high, I think up to 256 using the BOOST_PP_LIMIT_REPEAT macro.