Скотт Мейерс опубликовал содержание и статус своей следующей книги 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
в сигнатурах функций» касается использования в качестве возвращаемого типа (который не является частью обычной сигнатуры функции, а специализацией шаблона)? - Существуют ли различия для шаблонов функций-членов и не-членов?
std::enable_if
загромождать мои функции подписи (особенно некрасиво дополнительный nullptr
аргумент функции версии) , потому что она всегда выглядит так , как это, странное хак (для чего - то static if
могуществе сделать намного более красивым и чистым), используя шаблонную чёрную магию, чтобы использовать интересную языковую функцию. Вот почему я предпочитаю диспетчеризацию тегов, когда это возможно (ну, у вас все еще есть дополнительные странные аргументы, но не в общедоступном интерфейсе, а также гораздо менее уродливые и загадочные ).
=0
в typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
достижении? Я не мог найти правильные ресурсы, чтобы понять это. Я знаю, что первая часть раньше =0
имела тип члена, int
если U
и int
такой же. Большое спасибо!