Benötigen Template-Strukturen std :: decay, wenn Forwarding-Referenzen in C ++ 17 verwendet werden?

8

In C ++ 17 ist es möglich, Objekte zu instanziieren, ohne die Vorlagentypen anzugeben . Im Grunde würde dieser Code kompilieren:

%Vor%

Also, unter der Annahme dieses Codes:

%Vor%

Soll ich std::decay in der Tuple-Deklaration verwenden?

%Vor%

Weil ich so eine Funktion zum Zurückgeben eines Objekts basierend auf dem abgeleiteten Vorlagentyp schreiben würde:

%Vor%

Und ich kann dieses Muster im Konstruktor von Foo sehen, wo es Forwarding-Referenzen verwendet, um die Werte korrekt an das Tupel weiterzuleiten. Ich bin mir nicht sicher, ob sich die Typableitung hier genauso verhält.

    
Mário Feroldi 25.08.2016, 15:23
quelle

1 Antwort

4

Sie müssen die Interna Ihrer Klasse nicht ändern, damit sie mit der Ableitung von Klassenvorlagenargumenten funktioniert; Dafür gibt es Deduktionsanleitungen.

Am besten beginnen Sie mit dem Schreiben einer make_X -Funktion; Unabhängig davon, ob Sie eine angeben oder nicht, können Sie über die gewünschte Signatur entscheiden, ob Sie einen expliziten Deduktionsleitfaden schreiben müssen oder sich auf die impliziten Deduktionsleitfäden verlassen können, die von Ihren Konstruktoren abgeleitet wurden.

Tatsächlich verhält sich ein Deduktionsleitfaden, ob implizit oder explizit, genauso wie eine Funktion make_X (bis zum Kopieren des Konstruktors elision).

Ihre gewünschte makeFoo würde die folgende Deklaration haben:

%Vor%

Da dies eine Transformation für die Vorlagenargumente ausführt, müssen Sie einen expliziten Deduktionsleitfaden bereitstellen; Dies ist syntaktisch identisch mit der Deklaration von makeFoo , nur mit dem auto make entfernt:

%Vor%

Wenn Sie keinen expliziten Deduktionsleitfaden angeben, wird einer aus Ihrem Konstruktor generiert, ohne irgendwelche anderen Typumwandlungen als diejenigen, die bei der Ableitung von Template-Argumenten auftreten:

%Vor%

Dies ist nicht das, was Sie wollen, da es std::decay_t nicht anwendet. Das Ändern der Interna Ihrer Klasse (Hinzufügen von std::decay_t zu ts ) würde funktionieren, aber es ist unnötig, wenn ein expliziter Deduktionsleitfaden das Problem löst.

    
ecatmur 25.08.2016, 15:36
quelle