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)()
    }
};