Wenn ich eine Vorlage habe, die einen Standardcontainer umschließt, kann ich den Konstruktor initializer_list relativ leicht delegieren:
%Vor%Das funktioniert zum Beispiel gut mit std :: vector.
%Vor%Aber es funktioniert offensichtlich nicht für T als 'int' oder irgendeinen anderen Typ, der keinen verschachtelten value_type typedef hat. Daher möchte ich eine Art enable_if oder einen ähnlichen Trick verwenden, damit der Konstruktor initializer_list nicht ausgegeben wird, es sei denn, T definiert einen verschachtelten value_type typedef und ist aus std :: initializer_list konstruierbar.
Ich habe folgendes versucht, aber es funktioniert immer noch nicht, weil der Compiler (in meinem Fall clang ++ 3.1) immer noch über den ungültigen T :: value_type stolpert, wenn T int:
ist %Vor%Irgendwelche Gedanken darüber, wie man das Konzept ausdrücken kann: "Geben Sie dieser Schablone auf T einen Konstruktor der Initialisierungsliste über Ts Wert_Typ, genau dann, wenn T einen Wert_Typ typedef hat und aus einer Initialisiererliste von T :: Wert_Typ konstruierbar ist.
SFINAE funktioniert nur bei der Template-Parameter-Substitution (daher das S in SFINAE). Folgendes funktioniert:
%Vor% Wenn Sie keine Template-Funktion verwenden, wird die gesamte Klasse für den Typ int
(in Ihrem Beispiel) instanziiert, was zu einem Compiler-Fehler führt.
Beachten Sie, dass Sie die Funktionssignatur schöner gestalten können, wenn Sie einen zusätzlichen Vorlagenparameter verwenden:
%Vor%Tags und Links c++ c++11 templates initializer-list enable-if