Listing 4
// Support for nested metaloop
struct None {};
template <int start, int end , typename Nested = None>
struct Loop2 // outer loop: recurse
{
template <typename T>
static void eval( T expr ) {
Nested::eval( boost::bind( expr , start, _1 ) );
Loop2<start+1, end, Nested>::eval( expr );
}
};
template <int end , typename Nested>
struct Loop2 <end, end, Nested> // outer loop: terminate recursion
{
template <typename T>
static void eval( T expr ) {
Nested::eval( boost::bind( expr , end , _1) );
}
};
template <int start, int end>
struct Loop2 <start, end, None> // inner loop: recurse
{
template <typename T>
static void eval( T expr ) {
expr(start); // some compilers prefer => boost::bind(expr,start)()
Loop2<start+1, end>::eval( expr );
}
};
template <int end >
struct Loop2 <end, end, None> // inner loop: terminate recursion
{
template <typename T>
static void eval( T expr ) {
expr(end); // some compilers prefer => boost::bind(expr,end)()
}
};