使用 enable_if 来防止声明?
Using enable_if to prevent declaration?
Stroustrup C++ 第 4 版第 796 页指出“如果 Enable_if 的条件计算结果为假,则完全忽略它所属的整个函数声明。”和“……我们什么都不申报。”。
有人知道为什么要声明第一个 f0()
吗?我使用 enable_if
正确吗?
我的目标是禁用其中一个声明。我不确定 f0()
怎么会有 return 类型,因为 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.
你不能使用这种方式,因为你的对象无论如何都会被创建,因为 class 没有创建或不创建的条件。然后这里Enable_if<false, T> f0(int x) {};
,条件是false
那么就没有类型了。请注意,模板 class 是在一开始传递参数时实例化的,所做的只是将 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;
}
这里我们有两个函数模板,因此它们中的每一个都可能被实例化或不被实例化,这取决于class 中的条件。如果为真,函数将被实例化,反之亦然。注意这里只实例化了需要的函数
Stroustrup C++ 第 4 版第 796 页指出“如果 Enable_if 的条件计算结果为假,则完全忽略它所属的整个函数声明。”和“……我们什么都不申报。”。
有人知道为什么要声明第一个 f0()
吗?我使用 enable_if
正确吗?
我的目标是禁用其中一个声明。我不确定 f0()
怎么会有 return 类型,因为 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.
你不能使用这种方式,因为你的对象无论如何都会被创建,因为 class 没有创建或不创建的条件。然后这里Enable_if<false, T> f0(int x) {};
,条件是false
那么就没有类型了。请注意,模板 class 是在一开始传递参数时实例化的,所做的只是将 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;
}
这里我们有两个函数模板,因此它们中的每一个都可能被实例化或不被实例化,这取决于class 中的条件。如果为真,函数将被实例化,反之亦然。注意这里只实例化了需要的函数