Hi All
Consider following example:
BOOST_MPL_ASSERT((boost::is_same<
mpl::apply::type, boost::add_pointer<_1>,
int>::type
, int*>));
It should apply "add_pointer" to "int" and receive "int*", but it doesn't
work. It returns just "int".
Consider another example:
template
struct apply1:
mpl::lambda<F>::type::template apply<X>
{};
BOOST_MPL_ASSERT((boost::is_same<
mpl::apply/*nothing here*/,
boost::add_pointermpl::_1, int>::type
, int*>));
Handmade apply1 is used instead of mpl::apply. And this example works. What
difference? Usage of nested "::type" of apply metafunction. As result:
BOOST_MPL_ASSERT((boost::is_same<
mpl::apply::type,
boost::add_pointermpl::_1, int>::type
, int*>));
doesn't work. Seems like this change affects time of placeholders
substitution. Can anybody explain this in detail?
So, since apply1 is just simplified version of mpl::apply, why we cannot use
mpl::apply w/o "::type"? Because it cannot be compiled, at least using VC8.
And seems like the main difference is that apply1 is primary template but
mpl::apply is partial template specialization. Is such behavior standard?
Can anybody explain the logic?
Best regards,
Andriy Tylychko,
telya@mail.ru