Wählen Sie den Klassenkonstruktor mit enable_if aus
Betrachten Sie folgenden code:
#include <iostream>
#include <type_traits>
template <typename T>
struct A {
int val = 0;
template <class = typename std::enable_if<T::value>::type>
A(int n) : val(n) {};
A(...) { }
/* ... */
};
struct YES { constexpr static bool value = true; };
struct NO { constexpr static bool value = false; };
int main() {
A<YES> y(10);
A<NO> n;
std::cout << "YES: " << y.val << std::endl
<< "NO: " << n.val << std::endl;
}
Möchte ich selektiv definieren-Konstruktor A::A(int) nur für einige Arten mit enable_if. Für alle anderen Typen gibt es Standard-Konstruktor A::A (...), das sollte standardmäßig der Fall für compiler bei substitution scheitert. Aber das macht Sinn für mich-compiler (gcc version 4.9.0 20130714) ist immer noch beschweren
sfinae.cpp: In Instanziierung von 'struct': sfinae.cpp:19:11:
erforderlich von hier aus sfinae.cpp:9:5: Fehler: kein Typ mit dem Namen 'Typ' in
'struct std::enable_if'
A(int n) : val(n) {};
Ist so etwas möglich für den Konstruktor? Ist das möglich mit einem anderen Konstruktor(en) (copy-Konstruktor und move-Konstruktor)?
InformationsquelleAutor der Frage tomas789 | 2013-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das kann nicht funktionieren mit einem einzigen ausgefallenen template-parameter, da sein Wert muss gelöst werden, wenn der Vorlage-Klasse instanziiert wird.
Müssen wir aufschieben der substitution bis zu dem Punkt der Konstruktor template-Instantiierung. Eine Möglichkeit ist die Vorgabe der template-parameter T und eine zusätzliche dummy-parameter an den Konstruktor übergeben:
InformationsquelleAutor der Antwort jrok
in der Regel erfolgt dies über eine anonyme ausgefallenen argument :Können Sie nicht mit template-Parameter aus der Klasse zu SFINAE Methoden.
ALSO eine Möglichkeit ist das hinzufügen einer dummy-Typ ersetzen int :
finden Sie unter: http://ideone.com/2Gnyzj
Diese funktioniert, weil Sie ein member-template-parameter SFINAE aus dem Konstruktor aber der test ist immer wahr, so dass es nicht verschmutzen mit Ihren Kontrollen
InformationsquelleAutor der Antwort Joel Falcou