背景
C++11初始化列表可以用于使用构造函数参数初始化向量和数组。
下面是一段代码,我想使用初始化程序列表将所有eCOLORS
枚举从eCOLORS::First
到eCOLORS::Last
初始化到数组中。
原始代码
由于所有信息在编译时已知,我认为有一种方法可以解决这个问题。
enum class eCOLORS
{
kBLUE=0, kGREEN, kRED, kPURPLE,
First=kBLUE, Last=kPURPLE
};
template< typename E >
size_t Size()
{
return (size_t)(E::Last) - (size_t)(E::First) + 1;
}
struct Foo
{
Foo( eCOLORS color ) { }
};
int main(int argc, char** argv)
{
Foo a[2] = {
{ eCOLORS::kRED },
{ eCOLORS::kGREEN }
}; // works, but requires manual maintenance if I add another color
/* how to feed v with all the enums from First to Last
without hard-coding?
Foo v[Size<eCOLORS>()] = {
};
*/
}
丑陋的伪答案
目前的共识似乎是没有办法做到这一点。
我提出这个问题最初的意图是,我想自动创建一个Foo对象数组,其初始化仅基于
eColors
的枚举。我想要一个无需维护的解决方案,即使在添加更多eColors
条目后也能正常工作。
使用来自此早期帖子的Enum类,我可以编写一个函数模板,给我需要的功能。即使不使用该Enum类,您仍然可以从eCOLORS::First
循环到eCOLORS::Last
,并进行一些丑陋的转换。
我的丑陋的伪答案很笨重(远不如编译时初始化列表),但至少它是零维护的。
注意:如果有更好的解决方案出现,我将相应地更新OP。
template <typename T, typename E>
std::vector< T >
Initialize_With_Enums()
{
std::vector< T > v;
for( auto p : Enum<E>() )
v.push_back( T( p ));
return v;
}
int main( int argc, char** argv )
{
auto w = Initialize_With_Enum<Foo,eCOLORS>();
}