Почему я должен избегать std :: enable_if в сигнатурах функций
Скотт Мейерс опубликовалсодержание и статус его следующей книги EC ++ 11. Он написал, что один пункт в книге может бытьизбежатьstd::enable_if
в функции подписи ".
std::enable_if
может использоваться в качестве аргумента функции, в качестве возвращаемого типа или в качестве шаблона класса или параметра шаблона функции для условного удаления функций или классов из разрешения перегрузки.
Вэтот вопрос все три решения показаны.
Как параметр функции:
template
struct Check1
{
template
U read(typename std::enable_if< std::is_same::value >::type* = 0) { return 42; }
template
U read(typename std::enable_if< std::is_same::value >::type* = 0) { return 3.14; }
};
В качестве параметра шаблона:
template
struct Check2
{
template
U read() { return 42; }
template
U read() { return 3.14; }
};
Как тип возврата:
template
struct Check3
{
template
typename std::enable_if::type read() {
return 42;
}
template
typename std::enable_if::type read() {
return 3.14;
}
};
Какое решение должно быть предпочтительным и почему я должен избегать других?В каких случаяхизбежатьstd::enable_if
в функции подписи " касается использования в качестве возвращаемого типа (который не является частью обычной сигнатуры функции, но специализации шаблона)?Существуют ли какие-либо различия для шаблонов функций-членов и не-членов?