0

以下似乎不是有效的 c++ ( -std=c++2a)。我想var根据模板参数更改存储类b

#include <type_traits>

template <bool b>
void f() {
  typename std::conditional<b, static int, int>::type var;
}
4

2 回答 2

2

您可以提供 的完整专业化f,如下所示:

template <bool b> void f();

template <> void f<true>()
{
  static int var;
}

template <> void f<false>()
{
  int var;
}

这应该与您尝试达到的效果相同。

于 2020-04-19T20:11:58.617 回答
2

存储类说明符是对象声明的一部分,而不是对象类型的一部分。

因此,它不能用于需要类型的地方。

扩展 cigien 的专业化建议,您可以将变量包装到辅助容器类中。

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);
}

请注意,这样做的语义是完全不同的——一个是为每次调用在自动存储中创建的,另一个是初始化一次并在调用之间共享。在线程环境中,前者是安全的,后者不是,等等。

于 2020-04-19T20:58:20.470 回答