
On 7/9/07, Peter Dimov <pdimov@pdimov.com> wrote:
I Wei wrote:
With the boost::function<>::argN_type I can get boost::function's argument type. How can I do with the boost::lambda_functor?
You can't because there is no such thing. A lambda functor such as _1 + 2 can accept (almost) any argument x for which x+1 makes sense. What are you trying to do?
This is my situation: #include "boost/function.hpp" #include "boost/lambda/bind.hpp" #include "boost/shared_ptr.hpp" template <bool b> struct getter { template<typename T1, typename T2> void do_get(int n, T2 f) { // do something; } }; template <> struct getter<true> { template<typename T1, typename T2> void do_get(int n, T2 f) { // do something else; } }; template <typename T1, typename T2> void func(int n, T2 f) { typedef typename T2::arg1_type arg1_type; getter< boost::is_same< arg1_type, boost::shared_ptr<T1> >::value >do_get<T1, boost::function<void(arg1_type)> >(n, f); } class Foo { }; void foo(int n, Foo t) { } int main() { func<Foo>(1, boost::lambda::bind(&foo, 0, boost::lambda::_1)); return 0; } because the boost::lambda::bind return a lambda_functor, the " typedef typename T2::arg1_type arg1_type;" is wrong, if I add the second template argument to the caller func as func<Foo, boost::function<void(Foo)> >, everything will be ok. But there are a lot of similar calls with different second template argument, I want the compiler deduce it by the caller function's actual argument. How can I do that?