Por que devo evitar std :: enable_if em assinaturas de função

Scott Meyers postouconteúdo e status do seu próximo livro EC ++ 11. Ele escreveu que um item no livro poderia ser"Evitarstd::enable_if em assinaturas de função ".

std::enable_if pode ser usado como um argumento de função, como um tipo de retorno ou como um modelo de classe ou parâmetro de modelo de função para remover condicionalmente funções ou classes da resolução de sobrecarga.

Emessa questão todas as três soluções são mostradas.

Como parâmetro de função:

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 do modelo:

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;
   }   
};
Qual solução deve ser preferida e por que devo evitar outras pessoas?Em quais casos"Evitarstd::enable_if em assinaturas de função " diz respeito ao uso como tipo de retorno (que não faz parte da assinatura de função normal, mas de especializações de modelo)?Há alguma diferença para modelos de função de membro e não-membro?

questionAnswers(3)

yourAnswerToTheQuestion