引数の数はstd::function
ですか? NumOfArgument<...>::value
のようなものです。`std :: function`の引数の数を取得する方法は?
例えば、NumOfArgument<function<int(int, int)> >::value
は、私がその機能を提供していないstd::function
自体を考える2.
引数の数はstd::function
ですか? NumOfArgument<...>::value
のようなものです。`std :: function`の引数の数を取得する方法は?
例えば、NumOfArgument<function<int(int, int)> >::value
は、私がその機能を提供していないstd::function
自体を考える2.
でなければなりません。
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;
!
+1:いったんO_DOで動作するバリデーショナルテンプレートを取得したら、本当に簡単になります。 – Klaim
良い解決策...私は、 'sizeof ...(Args)'が正しい構文であることを知らなかった! 'sizeof()'は 'Args'に対して特別な意味を持っていますか?一般に 'sizeof()'はデータ型のサイズのみを扱い、要素数は扱わないためです。 – iammilind
@iammilind: 'sizeof ...(T)'は、パラメータパック 'T'のサイズを取得するための特別な構文です。これは 'sizeof(T)'(§5.3.3/ 5、§14.5.3/ 7)とは関係ありません。 – kennytm
最初にやりたい理由は何ですか? – Invictus