【发布时间】:2011-12-22 15:51:12
【问题描述】:
背景
C++11 初始化列表可用于初始化向量和数组,并将参数传递给构造函数。
下面有一段代码,我想使用初始化列表初始化这样一个数组,其中包含从 eCOLORS::First 到 eCOLORS::Last 的所有 eCOLORS 枚举。
原始码
由于所有信息在编译时都是已知的,我认为有办法解决这个问题。
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中添加更多条目后也可以使用。
使用来自this earlier post 的 Enum 类,我可以编写一个函数模板,为我提供所需的功能。即使不使用该 Enum 类,您仍然可以从 eCOLORS::First 循环到 eCOLORS::Last,以及一些丑陋的演员表。
我丑陋的伪答案是 kludgy(没有编译时初始化列表那么好),但至少它是零维护。
注意:如果出现更好的解决方案,我会相应地更新 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>();
}
【问题讨论】:
-
C++11 初始化列表不能用于初始化数组——虽然语法看起来很相似,但数组实际上使用聚合初始化。
标签: c++ initialization c++11