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!