Matt Calabrese wrote:
<snip> I'm still new to metaprogramming and the mpl lambda facilities and I'm having some trouble creating a metafunction which produces my desired type. This is what I've come up with, though it doesn't work - I'm assuming because of my second use of mpl::_1 in the nested template parameter of mpl::front in mpl::push_front (which I'd like to have represent the current state of the mpl::fold).
template< typename vector_t > struct get_alternatives { typename mpl::fold_backward< vector_t, mpl::vector< epsilon_parser >, typename mpl::push_front< mpl::_1,
spirit::alternative< mpl::_2,
typename mpl::front< mpl::_1 >::type > >::type >::type type; };
The problem is that you are evaluating the nested metafunction calls. What you want here is lazy evaluation: template< typename vector_t > struct get_alternatives { typedef typename mpl::fold_backward< vector_t , mpl::vector< epsilon_parser > , mpl::push_front< mpl::_1 , spirit::alternative< mpl::_2 , mpl::frontmpl::_1 > > >::type type; }; typename mpl::frontmpl::_1::type will evaluate mpl::front<> on a placeholder argument, which doesn't make any sense. HTH, -- Daniel Wallin