|
Boost Users : |
From: Matt Brown (deadguysfrom_at_[hidden])
Date: 2008-03-13 16:15:35
ah, I understand. thanks again.
On Thu, Mar 13, 2008 at 1:04 PM, Steven Watanabe <watanabesj_at_[hidden]> wrote:
> AMDG
>
>
>
> Matt Brown wrote:
> > 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.
> >
>
> As a matter of fact the runtime bind library /does/ give you a function
> object that can take a variable number of arguments.
>
> boost::bind(std::plus<int>(), _1, _1)(0, 2, 1, 3, 4); // OK. extra
> arguments ignored.
>
> What you're trying to do with MPL is the equivalent of saying:
>
> int (*f)(int, int) = boost::bind(std::plus<int>(), _1, _2);
>
> Which of course will not work.
>
> In short you can use the nested apply template, but there
> are no guarantees about exactly how it is defined. The MPL
> way of achieving your end is to pass metafunction classes around
> rather than template template arguments.
>
>
> #include <iostream>
> #include <boost/mpl/lambda.hpp>
> #include <boost/mpl/apply.hpp>
>
> #include <boost/type_traits/is_same.hpp>
> #include <boost/mpl/placeholders.hpp>
>
> template <class boolfunc>
>
> class test
> {
> public:
> static void print()
> {
> if(mpl::apply1<boolfunc, int>::type::value)
>
> {
> std::cout << "int: true\n";
> }
> }
> };
>
> int main(void)
> {
> test<
> boost::mpl::lambda<
> boost::is_same<boost::mpl::_1, int>
> >::type
> >::print();
>
>
> };
>
>
> 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