模板参数 SFINAE 不使用模板参数

Template parameters SFINAE not using a template argument

本文关键字:参数 SFINAE      更新时间:2023-10-16

为什么在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() {}