模板参数 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 发生,需要有一个模板参数来替代。因此,创建一个虚拟模板参数和一个虚拟特征,它们将分别接受它和 returns 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() {}