Я использовал enable_if
примерно таким образом с различными версиями GCC (до 5.2):
template< bool b, std::enable_if_t< b >... >
void fn() { std::cout << 1 << std::endl; }
template< bool b, std::enable_if_t< !b >... >
void fn() { std::cout << 2 << std::endl; }
// ...
fn< true >();
fn< false >();
Но, как оказалось, Clang 3.7 этого не приемлет ("вызов 'fn' неоднозначен").
Q1. Кто прав и почему?
Есть, конечно, и другие способы сделать это, но мне как-то не нравится
template< bool b >
std::enable_if_t< b, void > fa() { std::cout << 1 << std::endl; }
// ...
и тому подобное для того, чтобы сделать обычные части сигнатуры функции менее читаемыми, и
template< bool b, std::enable_if_t< b, int > = 0 >
void fd() { std::cout << 1 << std::endl; }
// ...
для включения нерелевантных элементов (типов и значений).
Вопрос 2. Какие другие (правильные, более читаемые, менее хакерские/странные) способы использования enable_if
/enable_if_t
существуют?
template <bool b, class = std::enable_if_t<b>>
? - person Quentin   schedule 01.12.2015std::enable_if_t< b >...
не имеет смысла. Вы объявляете пакет параметров шаблона типаvoid
. - person T.C.   schedule 01.12.2015std::enable_if_t< b, int >...
не имеет значения. - person vpozdyayev   schedule 01.12.2015