ホームページ  >  記事  >  バックエンド開発  >  可変個引数テンプレート クラス内の関数ポインターの引数の型にアクセスするにはどうすればよいですか?

可変個引数テンプレート クラス内の関数ポインターの引数の型にアクセスするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 05:29:27594ブラウズ

How can I access the argument types of a function pointer within a variadic template class?

可変引数テンプレート クラスの関数ポインター引数型へのアクセス

この問題は、任意の引数を持つ関数のジェネリック ファンクターの作成に関する以前のクエリから発生します。リスト。指定されたファンクター クラス 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。