Optional unterstützt die Erstellung von initializer_list für Vorlagen das Wrapping von Containern

8

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.

    
acm 26.11.2012, 14:56
quelle

1 Antwort

4

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%     
mfontanini 26.11.2012, 15:00
quelle