Scott Meyers veröffentlichte Inhalt und Status seines nächsten Buches EC ++ 11. Er schrieb, dass ein Punkt im Buch "Vermeiden Sie std::enable_ifin Funktionssignaturen" sein könnte .
std::enable_if kann als Funktionsargument, als Rückgabetyp oder als Klassenvorlage oder Funktionsvorlagenparameter verwendet werden, um Funktionen oder Klassen bedingt aus der Überlastungsauflösung zu entfernen.
In dieser Frage werden alle drei Lösungen gezeigt.
Als Funktionsparameter:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Als Vorlagenparameter:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Als Rückgabetyp:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Welche Lösung sollte bevorzugt werden und warum sollte ich andere vermeiden?
- In welchen Fällen betrifft "
std::enable_ifIn Funktionssignaturen vermeiden " die Verwendung als Rückgabetyp (der nicht Teil der normalen Funktionssignatur, sondern der Vorlagenspezialisierungen ist)? - Gibt es Unterschiede zwischen Funktionsvorlagen für Mitglieder und Nichtmitglieder?
std::enable_if, meine Funktionssignaturen (insbesondere die hässliche nullptrVersion mit zusätzlichen Funktionsargumenten) nicht gerne überladen möchte , weil es immer so aussieht, wie es ist, ein seltsamer Hack (für etwas, das static ifvielleicht etwas ist) viel schöner und sauberer machen) mit Vorlage Black-Magic, um eine interessante Sprachfunktion auszunutzen. Aus diesem Grund bevorzuge ich das Versenden von Tags, wann immer dies möglich ist (nun, Sie haben immer noch zusätzliche seltsame Argumente, aber nicht in der öffentlichen Oberfläche und auch viel weniger hässlich und kryptisch ).
=0in typename std::enable_if<std::is_same<U, int>::value, int>::type = 0erreichen? Ich konnte keine richtigen Ressourcen finden, um es zu verstehen. Ich weiß, dass der erste Teil zuvor =0einen Mitgliedstyp hat, intwenn Uund intder gleiche ist. Danke vielmals!