ジェネリック ファンクターは、さまざまな引数リストを持つ関数を処理する便利な方法を提供する便利なクラスです。ただし、これらのクラス内の関数ポインターの引数の型にアクセスするのは難しい場合があります。
次のファンクター クラスを検討してください。
<code class="cpp">template <typename... ARGS> class Foo { std::function<void(ARGS...)> m_f; public: Foo(std::function<void(ARGS...)> f) : m_f(f) {} void operator()(ARGS... args) const { m_f(args...); } };</code>
簡単にアクセスできますが、再帰的な「ピーリング」関数を使用する Operator() メソッドの args... では、コンストラクターで引数の型を取得するのがより複雑です。
これに対処するには、function_traits クラスを実装できます。
<code class="cpp">template<typename T> struct function_traits; 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; }; };</code>
このクラスを使用すると、関数ポインターの引数の型、戻り値の型、および引数の数を決定できます。
次のコードは、機能を示します。
<code class="cpp">struct R {}; struct A {}; struct B {}; void main() { typedef std::function<R(A, B)> fun; cout << std::is_same<R, function_traits<fun>::result_type>::value << endl; cout << std::is_same<A, function_traits<fun>::arg<0>::type>::value << endl; cout << std::is_same<B, function_traits<fun>::arg<1>::type>::value << endl; }</code>
以上が可変引数テンプレートクラスで関数ポインターの引数の型を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。