条件存储 class 取决于模板参数
Conditional storage class dependent upon template parameter
以下似乎不是有效的 c++ (-std=c++2a
)。我想根据模板参数 b
:
更改 var
的存储 class
#include <type_traits>
template <bool b>
void f() {
typename std::conditional<b, static int, int>::type var;
}
您可以提供 f
的完整专业化,如下所示:
template <bool b> void f();
template <> void f<true>()
{
static int var;
}
template <> void f<false>()
{
int var;
}
这应该与您要达到的效果相同。
存储 class 说明符是对象 declaration 的一部分,而不是对象类型的一部分。
因此它不能用于需要类型的地方。
扩展 cigien 的专业化建议,您可以将变量包装到辅助容器中 class。
template<bool b> struct A;
template<> struct A<true> {
inline static int var = 0;
};
template<> struct A<false> {
int var = 0;
};
template <bool b>
void f() {
A<b> a;
int& var = a.var;
do_something_with(var);
}
请注意,这样做的语义完全不同 - 一个是在每次调用的自动存储中创建的,另一个是初始化一次并在调用之间共享的。在线程环境中,前者是安全的,后者不是,等等
以下似乎不是有效的 c++ (-std=c++2a
)。我想根据模板参数 b
:
var
的存储 class
#include <type_traits>
template <bool b>
void f() {
typename std::conditional<b, static int, int>::type var;
}
您可以提供 f
的完整专业化,如下所示:
template <bool b> void f();
template <> void f<true>()
{
static int var;
}
template <> void f<false>()
{
int var;
}
这应该与您要达到的效果相同。
存储 class 说明符是对象 declaration 的一部分,而不是对象类型的一部分。
因此它不能用于需要类型的地方。
扩展 cigien 的专业化建议,您可以将变量包装到辅助容器中 class。
template<bool b> struct A;
template<> struct A<true> {
inline static int var = 0;
};
template<> struct A<false> {
int var = 0;
};
template <bool b>
void f() {
A<b> a;
int& var = a.var;
do_something_with(var);
}
请注意,这样做的语义完全不同 - 一个是在每次调用的自动存储中创建的,另一个是初始化一次并在调用之间共享的。在线程环境中,前者是安全的,后者不是,等等