可変引数テンプレート クラスの関数ポインター引数型へのアクセス
この問題は、任意の引数を持つ関数のジェネリック ファンクターの作成に関する以前のクエリから発生します。リスト。指定されたファンクター クラス Foo を使用すると、任意の数の引数を使用して関数ポインターを呼び出すことができます。ただし、ここでのタスクは、Foo コンストラクター内の関数ポインターから引数の型を抽出することです。
Foo クラスを定義する際、引数の型はコンストラクターの関数ポインター宣言で ARGS... としてカプセル化されます。引数の値は構築時には利用できませんが、その型は関数ポインター自体内でアクセスできます。
これらの引数の型を明らかにするには、function_traits クラスを活用できます。
<code class="cpp">template<typename T> struct function_traits; template<typename R, typename ...Args> struct function_traits<std::function<R(Args...)>> { // Number of arguments static const size_t nargs = sizeof...(Args); // Return type typedef R result_type; // Argument types at specified index template <size_t i> struct arg { typedef typename std::tuple_element<i, std::tuple<Args...>>::type type; }; };</code>
Foo コンストラクターでは、次のように function_traits を使用してこれらの引数の型にアクセスできます。
<code class="cpp">template<typename... ARGS> class Foo { ... Foo(std::function<void(ARGS...)> f) : m_f(f) { // Accessing the argument types static_assert(function_traits<std::function<void(ARGS...)>::nargs == sizeof...(ARGS), "Incorrect number of arguments"); ... } ... };</code>
function_traits を使用することにより、引数の型を抽出して Foo クラス内で利用でき、関数のシグネチャに基づいた高度な操作が可能になります。
以上が可変個引数テンプレート クラス内の関数ポインターの引数の型にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。