SFINAE beim cast-Operator
-
Hi,
wie kann ich am besten den cast-Operator durch SFINAE hier ausschalten?
template <std::size_t i n> class A { public: operator int() // Wenn n = 0 ist, disablen { return i }; private: int i; };Das Problem ist, dass ich auch keinen Dummy-Parameter reinhängen kann, da C++ darauf besteht, dass der cast-Operator keinen Parameter hat.
Wie löse ich das am besten? Irgendwas mit Tuples?!
Danke
![:] 🙂](https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso)
-
Oups, ich hab auf die schnelle ein paar Tippfehler gemacht:
template <std::size_t n> class A { public: operator int() // Wenn n = 0 ist, disablen { return i; } private: int i; };
-
Du könntest den operator int für n=0 spezialisieren und nicht definieren:
template<> A< 0 >::operator int();Alternativ kannst du auch einfach die ganze Klasse für n=0 spezialisieren und keinen operator int deklarieren.
-
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.