c++ - 模板参数 SFINAE 不使用模板参数

标签 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 缺少它的模板参数?例如,有没有一种方法可以在不引入另一个设置为某个默认值的模板参数的情况下实现上述行为?

最佳答案

为了让 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/

相关文章:

c++ - 基类中的虚函数

c++ - C++ 中的普通结构数组的通用 TableView/DataFrame 功能

c++ - Constexpr lambda 参数

c++ - 如何将数组的内容附加到 std::vector ?

c++ - c 中的快速排序代码,64 位 Windows 机器上无法解释的行为

c++ - 在初始化完成之前在单例上调用方法

c++ - 有没有更好的方法来排列字符串?

javascript - 如何在vue模板中显示异步数据

c++ - 这个图案的名字是什么?

C++17:元组解包时只保留一些成员