Ich versuche, die Typen der Konstruktorparameter einer Klasse abzuleiten. Es ist mir gelungen, die Parametertypen für Member-Methoden zu erhalten, aber mein Ansatz schlägt für Konstruktoren fehl, weil es darauf ankommt, den Typ eines Zeigers auf die Member-Methode zu bekommen.C++ Erhalte den Typ eines Konstruktors
#include <tuple>
#include <type_traits>
// Some type with a constructor
struct foo {
foo(int, double) {}
void test(char, char) {};
};
// Extract the first parameter
template<class T>
struct func_traits {};
template<class Return, class Type, class ... Params>
struct func_traits<Return(Type::*)(Params...)> {
using params = std::tuple<Params...>;
};
// Get the parameters for foo::test
using test_type = decltype(&foo::test);
using test_params = typename func_traits<test_type>::params;
static_assert(std::is_same<test_params, std::tuple<char, char>>::value, "Not the right tuple");
// Get the parameters for foo::foo
using ctor_type = decltype(&foo::foo); // Forbidden
using ctor_type = typename func_traits<ctor_type>::params;
static_assert(std::is_same<ctor_type, std::tuple<int, double>>::value, "Not the right tuple");
Es ist verboten, die Adresse eines Konstruktor zu erhalten, aber ich möchte nur die Art wissen, dass Zeiger würde haben.
- Gibt es eine andere Möglichkeit, den Typ eines solchen Zeigers zu bestimmen?
- Gibt es sonst eine andere Möglichkeit, den Typ eines Konstruktors zu erhalten?
Funktioniert Ihr vorhandener Code mit überladenen Funktionen? –
@KerrekSB Es funktioniert, wenn Sie die Überladung angeben, aber in diesem Fall kennen Sie die Parameter bereits, also ist es strittig. Ich nahm an, ich würde ein Problem mit Überladungen haben, aber ich bin noch nicht dort angekommen. –
Ist es gut genug für Sie eine Art Merkmale, die bestätigen (oder negieren), wenn ein Typ mit einer bestimmten Signatur erstellt werden kann? – max66