Scott Meyers veröffentlichte Inhalt und Status seines nächsten Buches EC ++ 11. Er schrieb, dass ein Punkt im Buch "Vermeiden Sie std::enable_if
in 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_if
In 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 nullptr
Version 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 if
vielleicht 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 ).
=0
in typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
erreichen? Ich konnte keine richtigen Ressourcen finden, um es zu verstehen. Ich weiß, dass der erste Teil zuvor =0
einen Mitgliedstyp hat, int
wenn U
und int
der gleiche ist. Danke vielmals!