Почему я должен избегать std :: enable_if в сигнатурах функций

Скотт Мейерс опубликовалсодержание и статус его следующей книги EC ++ 11. Он написал, что один пункт в книге может быть«Избегайтеstd::enable_if в функции подписи ".

std::enable_if может использоваться в качестве аргумента функции, в качестве возвращаемого типа или в качестве шаблона класса или параметра шаблона функции для условного удаления функций или классов из разрешения перегрузки.

Вэтот вопрос все три решения показаны.

В качестве параметра функции:

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

В качестве параметра шаблона:

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

Как тип возврата:

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;
   }   
};
Какое решение должно быть предпочтительным и почему я должен избегать других?В каких случаях«Избегайтеstd::enable_if в функции подписи " касается использования в качестве возвращаемого типа (который не является частью обычной сигнатуры функции, но специализации шаблона)?Существуют ли какие-либо различия для шаблонов функций-членов и не-членов?

Ответы на вопрос(1)

Ваш ответ на вопрос