首页 > 解决方案 > 模板参数 SFINAE 不使用模板参数

问题描述

为什么在 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我相信缺少模板参数的事实?例如,有没有办法在不引入另一个模板参数设置为某个默认值的情况下实现上述行为?

标签: c++templatesc++17enable-ifnon-type

解决方案


需要有一个模板参数来替代,以便 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() {}

推荐阅读