模板参数 SFINAE 不使用模板参数
Template parameters SFINAE not using a template argument
为什么在C++中不允许这样的结构:
#include <type_traits>
template<std::enable_if_t<true, bool> = true>
void fn() {}
template<std::enable_if_t<false, bool> = true>
void fn() {}
int main()
{
fn();
return 0;
}
似乎编译器在抱怨enable_if
缺少模板参数的事实,我相信?有没有办法实现上述行为,而无需引入另一个模板参数设置为某个默认值?
需要有一个模板参数来替换才能发生 SFINAE。因此,创建一个虚拟模板参数和一个虚拟特征,它将分别接受它并返回 true 和 false。
template<class T>
constexpr bool always_true = true;
template<class T>
constexpr bool always_false = false;
template<class T=void, std::enable_if_t<always_true<T>>* = nullptr>
void fn() {}
template<class T=void, std::enable_if_t<always_false<T>>* = nullptr>
void fn() {}
相关文章:
- 使用在用于SFINAE的void_t中具有参数的方法
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 使用 SFINAE 作为模板参数的编译时递归
- SFINAE 检查模板参数运算符
- SFINAE 内部概念模板参数
- SFINAE 和可变参数模板类
- SFINAE 用于具有默认参数的函数对象
- SFINAE 和模板函数实例化:为什么在启用了 SFINAE 类型的函数参数中使用模板参数时无法推断模板参数?
- 带有SFINAE的可变参数模板
- 模板参数 SFINAE 不使用模板参数
- Constexpr 函数作为 SFINAE 的模板参数
- 可变参数构造函数中的 SFINAE
- 在模板参数中评估 constexpr 时 SFINAE 失败
- SFINAE 优雅地检查"template template class"(在模板参数中)
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- 如何将模板参数从类型更改为非类型使 SFINAE 工作
- 使用函数模板和 SFINAE 通过参数进行区分
- SFINAE 用作返回类型,但不是参数类型
- 使用 SFINAE 检查模板参数继承
- SFINAE 和参数数量