2012-01-28 24 views

答えて

42

でなければなりません。

template<typename T> 
struct count_arg; 

template<typename R, typename ...Args> 
struct count_arg<std::function<R(Args...)>> 
{ 
    static const size_t value = sizeof...(Args); 
}; 

テストコード:Online demo


同様に、あなたのように、このにより多くの機能を置いてもよい:

typedef std::function<int(int, int)> fun; 
std::cout << count_arg<fun>::value << std::endl; //should print 2 

はこれを参照してくださいしかし、あなたはとしてそれを自分で実装することができます

template<typename T> 
struct function_traits;  //renamed it! 

template<typename R, typename ...Args> 
struct function_traits<std::function<R(Args...)>> 
{ 
    static const size_t nargs = sizeof...(Args); 

    typedef R result_type; 

    template <size_t i> 
    struct arg 
    { 
     typedef typename std::tuple_element<i, std::tuple<Args...>>::type type; 
    }; 
}; 

のように今、あなたは、のconstインデックスを使用して、各引数の型を取得することができます:それは種類のマングルされた名を出力します

std::cout << typeid(function_traits<fun>::arg<0>::type).name() << std::endl; 
std::cout << typeid(function_traits<fun>::arg<1>::type).name() << std::endl; 
std::cout << typeid(function_traits<fun>::arg<2>::type).name() << std::endl; 

Working demo

+5

+1:いったんO_DOで動作するバリデーショナルテンプレートを取得したら、本当に簡単になります。 – Klaim

+1

良い解決策...私は、 'sizeof ...(Args)'が正しい構文であることを知らなかった! 'sizeof()'は 'Args'に対して特別な意味を持っていますか?一般に 'sizeof()'はデータ型のサイズのみを扱い、要素数は扱わないためです。 – iammilind

+4

@iammilind: 'sizeof ...(T)'は、パラメータパック 'T'のサイズを取得するための特別な構文です。これは 'sizeof(T)'(§5.3.3/ 5、§14.5.3/ 7)とは関係ありません。 – kennytm

関連する問題