我想在课程static const std::vector
Foo
中{0, 1, 2, 3, ..., n}
初始化n
,其中Last
在编译时根据enum
的值在{ Foo::all
以下{。}}目标是Fruit
包含foo.h
枚举的所有值。
在enum Fruit { Apple, Orange, Banana, ..., Last };
class Foo {
public:
static const vector<int> all;
};
:
foo.cpp
在// initialization of Foo::all goes here.
:
{{1}}
答案 0 :(得分:6)
作为第三种选择:
namespace {
std::vector<int> create();
}
const std::vector<int> Foo::all = create();
create()
可以做任何喜欢的事情,即使每个元素都使用push_back()
,因为它创建的vector
不是const。
或者您可以使用<index_tuple.h>
create()
成为constexpr
函数
#include <redi/index_tuple.h>
namespace {
template<unsigned... I>
constexpr std::initializer_list<int>
create(redi::index_tuple<I...>)
{
return { I... };
}
}
const std::vector<int> Foo::all = create(typename redi::make_index_tuple<Last>::type());
答案 1 :(得分:4)
您可以使用boost::irange
:
auto range = boost::irange(0, n + 1);
const vector<int> Foo::numbers(range.begin(), range.end());
答案 2 :(得分:2)
如果您的n
足够小并且您使用的是支持c++0x
或c++11
的编译器,请将其拼写出来
const std::vector<int> Foo::all{0, 1, 2, 3, ..., n};
根据@ Jonathan的解释修正。