如何使用椭圆的SFINAE工作
How does using ellipses for SFINAE work?
在过去使用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
我之前的答案是错误的。对不起。我要把它修好。
这宣言:
template <typename U = T, void...>
Class() { }
违反(temp.res)/8:
程序是格式错误,不需要诊断,如果[…]可变变量模板的每个有效的特化都需要一个空的模板形参pack
不需要诊断,但编译器还是会选择发出一个。无论哪种方式,代码都是错误的。
另一方面
template <typename U = T, std::enable_if_t<std::is_void<U>::value>...>
Class() { }
不违反这个要求。我们有一个空包,所以我们不会遇到不能使用void
作为非类型模板参数的事实。此外,enable_if
的假设专门化可以提供一个不是void
的类型,因此由于上述限制,它不会是病态的。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- SFINAE:它如何与派生类一起工作?
- 为什么这个 SFINAE 没有按预期工作?
- Sfinae如何工作
- 如何将模板参数从类型更改为非类型使 SFINAE 工作
- 为什么SFINAE(enable_if)从类定义内部工作而不是从外部工作
- 构造函数上的SFINAE在VC2017中工作,但在clang / gcc中不起作用
- 为什么Sfinae在此示例中无法正常工作
- 变量args SFINAE默认构造函数在clang中工作,但在Visual Studio 2015中失败
- 这个 SFINAE C++语法是如何工作的
- SFINAE 不在 llvm/clang 上工作
- 无法使SFINAE工作
- 无法让SFINAE在功能检测器中工作
- SFINAE不像预期的那样工作
- 不可能启用/禁用带有sfinae的typedef.工作区
- SFINAE在返回类型中工作,但不作为模板参数
- 如何使用椭圆的SFINAE工作
- 为什么SFINAE导致编译器错误,它应该工作
- SFINAE 在以下功能has_member无法正常工作