SFINAE beim cast-Operator
-
Erteres wäre ein Möglichkeit, doch zieht der Compiler den Operator immer noch hinzu, weil er ja nicht erkennt, dass er nicht definiert ist, oder?
Zweites kommt nicht in Frage, zu viel Code Duplizierung.
Ich habe eine Möglichkeit gefunden:
template <typename T, typename> struct GetFirst { typedef T Result; }; template <std::size_t n> class A { public: operator typename GetFirst<int, typename std::enable_if<n != 0>::type>::Result() { return i; } private: int i; };Das sollte es tun, oder geht es noch eleganter?
-
SFINAE schrieb:
Das sollte es tun, oder geht es noch eleganter?
Nö. Ist bei gcc
SFINAE.
-
Och neeee, so kann man ja keine A<!=0>-Objekte mehr erzeugen...
-
volkard schrieb:
SFINAE schrieb:
Das sollte es tun, oder geht es noch eleganter?
Nö. Ist bei gcc
SFINAE.Failure is an error? Was für ne Weisheit

-
#include <type_traits> #include <iostream> template <size_t N> class A { public: template <typename = typename std::enable_if<N!=0>::type> operator int() { return i; } private: int i; }; int main() { A<0> x; int xx = x; A<1> y; int yy = y; }Setzt aber C++11 voraus.
-
Ich habe es zwar nicht getestet, aber müsste nicht folgendes gehen:
operator typename std::enable_if<N != 0, int>::type() { return i; }
-
314159265358979 schrieb:
Ich habe es zwar nicht getestet, [...]
Das sollte so oder so nicht funktionieren.
Es geht erst ab C++2011 so, wie es camper gezeigt hat (über den Trick von Default-Template-Parametern)
-
314159265358979 schrieb:
Ich habe es zwar nicht getestet, aber müsste nicht folgendes gehen:
operator typename std::enable_if<N != 0, int>::type() { return i; }Das ist kein Funktionstemplate.
-
Verstehe ich zwar nicht, aber ich habe auch seit Ewigkeiten nichts mehr mit SFINAE gemacht.
-
Das Prinzip von SFINAE beruht darauf, dass es sich um Funktionstemplates handelt, denn nur deren Fehler werden bei der Suche nach passenden Funktionen übersprungen.
C++11 braucht es neben
std::enable_ifauch für Default-Funktionstemplate-Parameter.