为什么在 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() {}
关于c++ - 模板参数 SFINAE 不使用模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57015068/