3

以下のの値に基づいて、コンパイル時に既知の場所static const std::vectorにinクラス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

3番目のオプションとして:

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

そして、それが作成するのはconstではないので、各要素にcreate()使用しても、好きなことを何でもできます。push_back()vector

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++0xまたはをサポートするコンパイラを使用している場合c++11は、それを綴ってください

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

@Jonathanの説明に従って修正されました。

于 2012-12-31T19:44:16.970 に答える