我有类,每个类都返回其名称
struct IFoo {
virtual const char * GetName() const = 0;
}
struct Foo : IFoo {
const char * GetName() const { return "Foo"; }
}
struct Bar: IFoo {
const char * GetName() const { return "Bar"; }
}
以及其他地方:
Foo* a = new Foo();
Foo* b = new Foo();
std::map<const char *, int> data;
data[a->GetName()] = 0;
printf("%i", data[b->GetName()]);
字符串文字应存储在内存中的一个位置,但它是100%吗?这段代码在gcc中有效,但我不确定它的多平台性。
答案 0 :(得分:5)
将
const char *
字面值用作std::map
密钥是否安全?
是
但是,请注意,这不能保证找到您的对象(但可能会根据实现情况而定):
data["Foo"]
这保证找不到你的对象:
char[] str = "Foo";
data[str];
使用基于std::strcmp
的自定义地图比较器可以使上述两种情况都有效。
然后剩下的唯一陷阱是可能将指向本地缓冲区的指针存储到地图中,这将超过本地缓冲区。如果你当然只存储字符串文字,那就不会发生,但这是你在使用地图时必须记住的事情。 std::string
密钥不会有这样的警告。