c++ - 使用enable_if来防止声明?

标签 c++ templates sfinae enable-if

Stroustrup C++ 第 4 版第 796 页指出“如果 Enable_if 的条件计算结果为 false,则它所属的整个函数声明将被完全忽略。”和“......我们不声明任何东西。”。

有谁知道为什么第一个f0()正在宣布?我正在使用enable_if正确吗?

我的目标是禁用其中一个声明。我不知道如何 f0()可以有一个返回类型,如false版本应该丢失 ::type .

#include <type_traits>
using namespace std;

template<bool B, typename T>
using Enable_if = typename std::enable_if<B,T>::type;

template <class T>
class X {
    Enable_if<false, T> f0(int x) {};
    Enable_if<true, T> f0(int x) {};
};

int main(void)
{
    X<void> xx;
    return 0;
}

编译:

clang++ -std=c++11 -Wall -pedantic test197.cc && ./a.out
test197.cc:10:24: error: functions that differ only in their return type cannot
      be overloaded
    Enable_if<true, T> f0(int x) {};
    ~~~~~~~~~~~~~~~~~~ ^
test197.cc:9:25: note: previous definition is here
    Enable_if<false, T> f0(int x) {};
    ~~~~~~~~~~~~~~~~~~~ ^
1 error generated.

最佳答案

你不能使用这种方式,因为你的对象在任何情况下都会被创建,因为类没有创建或不创建的条件。然后这里Enable_if<false, T> f0(int x) {}; ,条件为false那么就没有类型了。请注意,模板类是在开始时传递参数时实例化的,所做的只是替换 T通过void .

您可以使用的一种方法如下

#include <type_traits>
using namespace std;

template<bool B, typename T>
using Enable_if = typename std::enable_if<B,T>::type;


struct X {
    template <class T>
    Enable_if<true, T> f0(int x) {}
    template <class T>
    Enable_if<false, T> f0(int x) {}
};

int main(void)
{
    X xx;
    xx.f0<void>(4);
    return 0;
}

这里我们有两个函数模板,因此它们中的每一个都可以实例化或不实例化,这取决于类内部的条件。如果为真,该函数将被实例化,反之亦然。请注意,这里只实例化了所需的函数。

关于c++ - 使用enable_if来防止声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63094844/

相关文章:

c++ - 您能否为具有非类型参数的模板类型部分特化模板

c++ - boost::enable_if_c 似乎不起作用

c++ - qmake:将单个cpp文件编译成可执行文件

c++ - binary_search、find_if 和 <functional>

c++ - 计算两个数之间质数个数的函数

c++ - 如何调试 STL/C++ 的 GCC/LD 链接过程

c++ - 为什么模板只能在头文件中实现?

python - 将初始数据从数据库传递到 Django 表单向导模板

c++ - 在 T 的命名空间内调用函数

c++ - sfinae 关于在类主体外部定义的成员函数