2010-01-29 105 views
6

它工作得很好,對於普通的香草函數。下面的代碼工作得很好。它打印出究竟什麼是應該:使用Boost獲取成員函數的參數和參數類型? (boost :: function_traits)

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; 
} 

那麼,問題是,怎麼能做到這一點,如果foo是類酒吧的成員函數?

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

我嘗試了這些結構的無數組合:BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()BOOST_TYPEOF_REGISTER_TYPE()的boost ::裁判的boost :: remove_pointer的boost ::綁定的boost ::的mem_fn

等等,等等......沒有喜悅。

回答

8

Boost Function Types很可能是自然的解決方案:

#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; 
} 
+0

相信我,我嘗試過使用BOOST_TYPEOF(&bar :: foo)的每個變體,我可以想到。我希望有人可以發佈一個小型的工作計劃,就像問題中的問題一樣。 – 2010-01-29 20:56:08

+0

大多數人都這樣做。自1971年以來,我一直是一名專業程序員,並且我已經瞭解到,拼寫出來不會有什麼傷害。謝謝你的幫助。 – 2010-01-29 22:26:21

+0

@Jive,沒問題,我什麼也沒有得到它 - 儘管這讓我有意嘗試再次完成C++反射庫的事情;> – 2010-01-29 22:27:52

1

科內爾·基利爾威奇斯釘它。這裏將解決方案與測試消息分開。

#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

有趣且有用。 BTW需要額外的 '的#include ' – groovehunter 2011-02-14 16:44:39

相關問題