Скотт Мейерс опубликовал содержание и статус своей следующей книги EС++ 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
в сигнатурах функций" касается использования в качестве возвращаемого типа (который не является частью обычной сигнатуры функции, а специализацией шаблона)? - Существуют ли какие-либо различия для шаблонов функций-членов и не-членов?