Heim >Backend-Entwicklung >C++ >Wie kann ich auf die Argumenttypen eines Funktionszeigers innerhalb einer variadischen Vorlagenklasse zugreifen?

Wie kann ich auf die Argumenttypen eines Funktionszeigers innerhalb einer variadischen Vorlagenklasse zugreifen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 05:29:27662Durchsuche

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

Zugriff auf Funktionszeiger-Argumenttypen in der Variadic-Vorlagenklasse

Dieses Problem ergibt sich aus einer früheren Abfrage bezüglich der Erstellung eines generischen Funktors für Funktionen mit beliebigem Argument Listen. Die angegebene Funktorklasse Foo ermöglicht den Aufruf eines Funktionszeigers mit einer beliebigen Anzahl von Argumenten. Die Aufgabe besteht nun jedoch darin, die Argumenttypen aus dem Funktionszeiger innerhalb des Foo-Konstruktors zu extrahieren.

Bei der Definition der Foo-Klasse werden die Argumenttypen als ARGS... in der Funktionszeigerdeklaration des Konstruktors gekapselt. Während die Werte der Argumente zur Konstruktionszeit nicht verfügbar sind, sind ihre Typen innerhalb des Funktionszeigers selbst zugänglich.

Um diese Argumenttypen aufzudecken, kann man die Klasse „function_traits“ nutzen:

<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>

Innerhalb Mit dem Foo-Konstruktor kann man mit function_traits wie folgt auf diese Argumenttypen zugreifen:

<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>

Durch die Verwendung von function_traits können die Argumenttypen innerhalb der Foo-Klasse extrahiert und genutzt werden, wodurch anspruchsvolle Operationen basierend auf der Signatur der Funktion ermöglicht werden.

Das obige ist der detaillierte Inhalt vonWie kann ich auf die Argumenttypen eines Funktionszeigers innerhalb einer variadischen Vorlagenklasse zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn