Warum sollte ich std :: enable_if in Funktionssignaturen vermeiden?

Scott Meyers hat Folgendes mitgeteilt:Inhalt und Status seines nächsten Buches EC ++ 11. Er schrieb, dass ein Punkt im Buch sein könnte"Vermeidenstd::enable_if in Funktionssignaturen ".

std::enable_if kann als Funktionsargument, als Rückgabetyp oder als Klassenvorlage oder Funktionsvorlagenparameter verwendet werden, um Funktionen oder Klassen bedingt aus der Überladungsauflösung zu entfernen.

Imdiese Frage Alle drei Lösungen sind dargestellt.

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"Vermeidenstd::enable_if in Funktionssignaturen " betrifft die Verwendung als Rückgabetyp (der nicht Teil der normalen Funktionssignatur, sondern der Template-Spezialisierung ist)?Gibt es Unterschiede für Funktionsvorlagen von Mitgliedern und Nichtmitgliedern?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage