问题不在于初始化的性能,而在于初始化的顺序。如果有人之前使用过您的地图main
已经开始(例如在命名空间作用域变量的初始化时),那么您就是 SOL,因为您无法保证您的映射在用户初始化使用它之前已被初始化。
然而你can在编译时做这件事。字符串文字是常量表达式,枚举器也是如此。简单的线性时间复杂度结构
struct entry {
char const *name;
os value;
};
constexpr entry map[] = {
{ "windows", os::Windows },
{ "linux", os::Linux },
{ "mac", os::Mac }
};
constexpr bool same(char const *x, char const *y) {
return !*x && !*y ? true : (*x == *y && same(x+1, y+1));
}
constexpr os value(char const *name, entry const *entries) {
return same(entries->name, name) ? entries->value : value(name, entries+1);
}
如果你使用value(a, b)
在常量表达式上下文中,并且您指定的名称不存在,您将收到编译时错误,因为函数调用将变得非常量。
To use value(a, b)
在非常量表达式上下文中,您最好添加安全功能,例如向数组添加结束标记并在value
如果您击中结束标记(只要您从未击中结束标记,函数调用仍将是常量表达式)。