Use Boost to get arity and paramerter types of a member function? (Boost :: function_traits)

It works great for simple vanilla features. The code below works just fine. He prints exactly what should:

int __cdecl(int, char) 2 int,char 

 #include <boost/type_traits.hpp> #include <boost/function.hpp> #include <boost/typeof/std/utility.hpp> #include <iostream> using std::cout; using std::endl; int foo(int, char) { return 0; } int main() { typedef BOOST_TYPEOF(foo) foo_type;; typedef boost::function_traits<foo_type> function_traits; cout << typeid(foo_type).name() << endl; cout << function_traits::arity << endl; cout << typeid(function_traits::arg1_type).name() << ","; cout << typeid(function_traits::arg2_type).name() << endl; return 0; } 

So the question is, how can this be done if foo is a member function of the bar class?

 struct bar { int foo(int, char) { return 0; } }; 

I tried countless combinations of these constructs: BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP () BOOST_TYPEOF_REGISTER_TYPE () boost :: ref boost :: remove_pointer boost :: bind boost :: mem_fn

etc. etc. There is no joy.

+6
c ++ function boost member
source share
2 answers

Boost Function Types is likely to be a natural solution:

 #include <boost/function_types/function_type.hpp> #include <boost/function_types/parameter_types.hpp> #include <boost/function_types/function_arity.hpp> #include <boost/typeof/std/utility.hpp> #include <iostream> struct bar { int foo(int, char) { return 0; } }; int main() { typedef BOOST_TYPEOF(&bar::foo) foo_type; std::cout << typeid(foo_type).name() << std::endl; std::cout << boost::function_types::function_arity<foo_type>::value << std::endl; std::cout << typeid(boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,1>::type).name() << ","; std::cout << typeid(boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,2>::type).name() << ","; return 0; } 
+8
source share

Cornel Kiselevich nailed it. Here, this solution is separated from test messages.

 #include <boost/function_types/function_type.hpp> #include <boost/function_types/parameter_types.hpp> #include <boost/function_types/function_arity.hpp> #include <boost/typeof/std/utility.hpp> #include <iostream> struct bar { int foo(int, char) { return 0; } }; int main() { typedef BOOST_TYPEOF(&bar::foo) foo_type; int arity = boost::function_types::function_arity<foo_type>::value; typedef boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,1>::type arg1; typedef boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,2>::type arg2; std::cout << typeid(foo_type).name() << std::endl; std::cout << arity << std::endl; std::cout << typeid(arg1).name() << ","; std::cout << typeid(arg2).name() << std::endl; return 0; } 
+1
source share

All Articles