2017-01-12 2 views
1

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?
+0

Funktioniert Ihr vorhandener Code mit überladenen Funktionen? –

+0

@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. –

+0

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

Antwort

5

Es gibt keine Möglichkeit, einen Konstruktor als Funktion zu bezeichnen. Der Standard besagt sehr explizit, dass Konstruktoren keine Namen haben. Sie können die Adresse eines Konstruktors nicht übernehmen.

Eine Alternative könnte sein, jeglicher Art zu erfordern mit einigen Maschinen verwendet werden, dass es einen zugehörigen Merkmale Typ hat, der Tupel oder etwas entsprechend den Konstrukteuren zur Verfügung stellt.

Bevor wir Sprachunterstützung für decltype erhielten, erinnere ich mich an die Boost-Funktion zum Finden des Ergebnistyps einer Funktion, die auf einem Registrierungsschema für mögliche Typen beruht.

Verwandte Themen