Boost logo

Boost Users :

From: Matt Brown (deadguysfrom_at_[hidden])
Date: 2008-03-13 15:27:38


Thanks for the reply, Steven. You were able to give me enough
direction to solve the problem. I simply had to write a wrapper class
around apply that had the correct template signature.

template <typename MetaFunc>
struct apply1
{
        template <typename T>
        struct apply : MetaFunc::apply<T>
        {};
};

int main(void)
{
        test<
                apply1<
                        boost::mpl::lambda<
                                boost::is_same<boost::mpl::_1, int>
>::type
>::apply
>::print();
};

I've gotta say, though, that this behavior of MPL's lambda, bind,
quoten, etc Meftafunctions is counter intuitive (to put it nicely).
The runtime bind library, as a counter example, is intuitive. When
you bind one argument to a second order function, you get a first
order function. If the runtime bind library was designed similar to
the bind facility in MPL, it would give you a function with a variable
argument list, which I believe anyone would agree is counter
intuitive. I'm sure there is a good reason MPL was designed this way,
though I doubt its a better reason than the reason it should have been
designed intuitively.

-Matt

On Thu, Mar 13, 2008 at 9:31 AM, Steven Watanabe <watanabesj_at_[hidden]> wrote:
> AMDG
>
>
>
> Matt Brown wrote:
> > I just tried to build this code in visual studio 2005, and got error:
> >
> > error C3201: the template parameter list for class template
> > 'boost::mpl::bind2<F,T1,T2>::apply' does not match the template
> > parameter list for template parameter 'boolfunc'
> >
> > This code works fine with gcc, and boost mpl portability page
> > (http://www.boost.org/libs/mpl/doc/tutorial/portability.html) says my
> > version of visual studio should be able to compile this. However, it
> > appears to think the lambda< ... >::type::apply is not
> > a metafunction. Any help will be greatly appreciated.
> >
> > -Matt Brown
> >
> >
> >
> > #include <iostream>
> > #include <boost/mpl/lambda.hpp>
> > #include <boost/type_traits/is_same.hpp>
> > #include <boost/mpl/placeholders.hpp>
> >
> > template <template <typename> class boolfunc>
> > class test
> > {
> > public:
> > static void print()
> > {
> > if(boolfunc<int>::type::value)
> > {
> > std::cout << "int: true\n";
> > }
> > }
> > };
> >
> > int main(void)
> > {
> > test<
> > boost::mpl::lambda<
> > boost::is_same<boost::mpl::_1, int>
> > >::type::apply
> > >::print();
> > };
>
> Don't do that.
>
>
> boost::mpl::lambda<
> boost::is_same<boost::mpl::_1, int>
> >::type::apply<int>::type
>
>
> will work, but apply actually takes extra default arguments and thus cannot
> be bound to a template template argument.
>
> i.e. (For exposition only)
>
> template<class T>
> struct lambda {
> struct type {
> template<class T0 = na, class T1 = na, ...>
> struct apply {
> typedef /unspecified/ type;
> };
> };
> };
>
> In Christ,
> Steven Watanabe
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net