初始化静态地图的正确方法是什么?我们需要一个初始化它的静态函数吗?
如果我编码这个
std::map<int, char> example = {
(1, 'a'),
(2, 'b'),
(3, 'c')
};
Run Code Online (Sandbox Code Playgroud)
然后g ++对我说
deducing from brace-enclosed initializer list requires #include <initializer_list>
in C++98 ‘example’ must be initialized by constructor, not by ‘{...}’
Run Code Online (Sandbox Code Playgroud)
这让我很烦,因为构造函数是运行时的,理论上可能会失败.
当然,如果确实如此,它将很快失败并且应该一直这样做,所以我应该快速找到并纠正问题.
但是,我仍然很好奇 - 无论如何在编译时初始化地图,矢量等?
编辑:我应该说我正在为嵌入式系统开发.并非所有处理器都具有C++ 0x编译器.最受欢迎的可能是,但我不想遇到问题并且必须维护2个版本的代码.
至于Boost,我尚未决定.他们在嵌入式系统中使用他们的有限状态机类是多么的愚蠢,所以这就是我在这里编写的事件/事件/状态/ Fsm类.
叹了口气,我想我最好安全地玩,但我希望这个讨论对其他人有帮助.
我有一个带有一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换成简单的表达式).在Java中,我会这样做
class MyClass {
static int myDatum;
static {
/* do some computation which sets myDatum */
}
}
Run Code Online (Sandbox Code Playgroud)
除非我弄错了,C++不允许这样的静态代码块,对吧?我应该做什么呢?
我想要解决以下两个选项:
对于第二种选择,我在考虑:
class StaticInitialized {
static bool staticsInitialized = false;
virtual void initializeStatics();
StaticInitialized() {
if (!staticsInitialized) {
initializeStatics();
staticsInitialized = true;
}
}
};
class MyClass : private StaticInitialized {
static int myDatum;
void initializeStatics() {
/* computation which sets myDatum */
}
};
Run Code Online (Sandbox Code Playgroud)
但这是不可能的,因为C++(目前?)不允许初始化非const静态成员.但是,至少可以通过表达式将静态块的问题减少到静态初始化的问题......