При использовании SFINAE выбрать конструктор перегрузкам в прошлом, я обычно используются следующие:Как работает эллипс для SFINAE?
template <typename T>
class Class {
public:
template <typename U = T, typename std::enable_if<std::is_void<U>::value, int>::type=0>
Class() {
std::cout << "void" << std::endl;
}
template <typename U = T, typename std::enable_if<!std::is_void<U>::value, int>::type=0>
Class() {
std::cout << "not void" << std::endl;
}
};
Однако, я просто наткнулся на эту альтернативу:
template <typename U = T, typename std::enable_if<std::is_void<U>::value>::type...>
Class() {
std::cout << "void" << std::endl;
}
Учитывая, что следующее является незаконным. ..
template <typename U = T, void...> // ERROR!
Class() { }
... как работает альтернатива выше, используя эллипсы, а не аргумент шаблона непигового типа?
Полный код: http://coliru.stacked-crooked.com/a/64a1aaf13ce6099b
@peppe Но 'template' также является незаконным. Разве это не нужно использовать 'void' в качестве аргумента по умолчанию для параметра типа? Как и в, 'template :: type>'? –
zennehoy
@peppe В качестве параметра шаблона * type *, а не в качестве параметра шаблона шаблона. – Barry
@Barry: IOW 'template :: type>' является незаконным, потому что он будет выводить 'void', если' condition' истинно, так как это параметр не-типа, а 'template :: type> 'является законным? –
peppe