¿Por qué debería evitar std :: enable_if en firmas de funciones?

Scott Meyers ha publicadocontenido y estado de su próximo libro EC ++ 11. Escribió que un artículo en el libro podría ser"Evitarstd::enable_if en firmas de funciones ".

std::enable_if se puede utilizar como un argumento de función, como un tipo de retorno o como una plantilla de clase o parámetro de plantilla de función para eliminar condicionalmente funciones o clases de la resolución de sobrecarga.

Enesta pregunta Se muestran las tres soluciones.

Como parámetro de función:

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; }   
};

Como parámetro de plantilla:

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; }   
};

Como tipo de retorno:

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;
   }   
};
¿Qué solución debería preferirse y por qué debería evitar otras?En que casos"Evitarstd::enable_if en firmas de funciones " ¿Se refiere al uso como tipo de devolución (que no es parte de la firma de función normal sino de las especializaciones de plantilla)?¿Hay alguna diferencia para las plantillas de función miembro y no miembro?

Respuestas a la pregunta(3)

Su respuesta a la pregunta