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

时间:2019-07-12 23:40:26

标签: c++ templates c++17 enable-if non-type

为什么在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缺少我相信的模板参数的事实?有没有一种方法可以实现上述行为而无需将另一个模板参数设置为某个默认值?

1 个答案:

答案 0 :(得分:1)

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