3

我想根据下面的值将一个类static const std::vector初始化Foo为编译时已知的{0, 1, 2, 3, ..., n}位置。目标是包含枚举的所有值。nLastenumFoo::allFruit

foo.h

enum Fruit { Apple, Orange, Banana, ..., Last };

class Foo {
public:
    static const vector<int> all;
};

foo.cpp

// initialization of Foo::all goes here.
4

3 回答 3

6

作为第三种选择:

namespace {
  std::vector<int> create();
}
const std::vector<int> Foo::all = create();

并且create()可以做任何它喜欢的事情,甚至使用push_back()每个元素,因为vector它创建的不是 const。

或者你可以create()使用constexpr<index_tuple.h>

#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());
于 2012-12-31T20:10:28.090 回答
4

您可以使用boost::irange

auto range = boost::irange(0, n + 1);
const vector<int> Foo::numbers(range.begin(), range.end());
于 2012-12-31T19:45:14.347 回答
2

如果您n足够小并且您使用支持c++0xor的编译器c++11,只需将其拼写出来

const std::vector<int> Foo::all{0, 1, 2, 3, ..., n};

根据@Jonathan 的解释修复。

于 2012-12-31T19:44:16.970 回答