c++ - 使用 enable_if 来阻止声明?
问题描述
Stroustrup C++ 第 4 版第 796 页指出“如果 Enable_if 的条件评估为假,则它所在的整个函数声明将被完全忽略。” 和“......我们不声明任何东西。”。
有谁知道为什么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
then 没有类型。请注意,模板类是在开头传递参数时实例化的,所做的只是替换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;
}
这里我们有两个函数模板,因此它们中的每一个都可能被实例化或不被实例化,这取决于类内部的条件。如果为真,该函数将被实例化,反之亦然。请注意,这里只实例化了所需的函数。
推荐阅读
- ruby - 使用用户名和密码休息客户端帖子
- python - 如何索引 3d 数组中具有不同行数的几个 2d numpy 数组?
- r - 库“TableOne”多重比较。逐行计算 p 值
- javascript - html 表单文本元素,无法正确解析为 javascript 方法
- c# - 在 C# 中获取 XML 中的第一个节点名称
- javascript - React 箭头函数产生不同的调试体验
- javascript - 在 HTML 表格自动完成下为 HtmlEditor 控件
- ruby - Ruby - 函数更改哈希但不是整数变量
- go - 缓存 auth0 JWK 是不是一个坏主意
- c# - 如何通过聚合根控制不变量