2012-12-31 65 views
3

我想在那裏n是在編譯時基於的Lastenum值已知initalize在Foostatic const std::vector{0, 1, 2, 3, ..., n}到。目標是Foo::all包含Fruit enum的所有值。C++初始化const的靜態矢量動態

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

您可以使用boost::irange

auto range = boost::irange(0, n + 1); 
const vector<int> Foo::numbers(range.begin(), range.end()); 
2

如果您n足夠小,可使用編譯器,它支持c++0xc++11,只是拼出來

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

根據@ Jonathan的解釋進行修正。

+0

慣用C++ 11的方式不會使用'='符號的constexpr功能。 –

+0

@JonathanWakely,除了與BigInt i = 5;'BigInt i(5);'相同的交易之外,還有什麼區別嗎?我從來沒有見過強烈的意見? – chris

+0

@JonathanWakely好的,我不知道。 g ++接受任一個。 –

6

作爲第三種選擇:

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

而且create()什麼都可以做它喜歡的,即使使用push_back()每個元素,因爲vector它創建ISN」 t常量。

或者你可以讓create()使用<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());