#include #include #include #include #include class a; class b; struct test_failure { template< class Previous_State, class T > struct apply { BOOST_STATIC_ASSERT( (boost::is_same< T, a >::value) ); class type {}; }; }; class initial_state {}; template< class List > struct test_failure2; template<> struct test_failure2< boost::mpl::null_node > { class result {}; }; template< class Head, class Tail > struct test_failure2< boost::mpl::list_node< Head, Tail > > { BOOST_STATIC_ASSERT( (boost::is_same< Head, a >::value) ); typedef typename test_failure2< Tail >::result result; }; int main() { using boost::mpl::fold; using boost::mpl::list; #ifndef TEST2 typedef fold< list< a, a, b >::type, initial_state, test_failure >::type result; #else using boost::mpl::list_node; using boost::mpl::null_node; typedef test_failure2< list_node< a, list_node< a, list_node< b, null_node > > > >::result result; #endif std::cout << typeid( result ).name() << std::endl; return 0; }