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


content and status"Avoid std::enable_if in function signatures"

Scott Meyers posted of his next book EC++11.He wrote that one item in the book could be .

std::enable_if

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

this question

Во всех трех решений, показаны.

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

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;   }   };
  • Which solution should be preferred and why should I avoid others?
  • In which cases "Avoid std::enable_if in function signatures" concerns usage as return type (which is not part of normal function signature but of template specializations)?
  • Are there any differences for member and non-member function templates?