У меня есть карта, представляющая объект БД. Я хочу получить от него "хорошо известные" значения
std::map<std::string, std::string> dbo;
...
std::string val = map["foo"];
все отлично, но мне кажется, что "foo" преобразуется во временную строку при каждом вызове. Конечно, было бы лучше иметь константу std::string (конечно, это, вероятно, крошечные накладные расходы по сравнению с диском IO, который просто приносил объект, но по-прежнему остается актуальным вопросом). Итак, какова правильная идиома для констант std::string?
например - я могу иметь
const std::string FOO = "foo";
в hdr, но затем я получаю несколько копий
РЕДАКТИРОВАТЬ: ответа еще нет, как объявить константы std::string. Игнорируйте всю карту, STL и т.д. Много кода в значительной степени ориентировано на std::string (мое конечно есть), и естественно, что для них нужны константы, не платя много раз за выделение памяти
EDIT2: вынул вторичный вопрос, на который ответил PDF от Мануэля, добавил пример плохой идиомы
EDIT3: краткое изложение ответов. Обратите внимание, что я не включил те, которые предложили создать новый класс строк. Я разочарован, потому что я надеялся, что есть простая вещь, которая будет работать только в файле заголовка (например, const char * const). Во всяком случае
a) от Марка b
std::map<int, std::string> dict;
const int FOO_IDX = 1;
....
dict[FOO_IDX] = "foo";
....
std:string &val = dbo[dict[FOO_IDX]];
b) от vlad
// str.h
extern const std::string FOO;
// str.cpp
const std::string FOO = "foo";
c) от Roger P
// really you cant do it
(b) кажется самым близким к тому, что я хотел, но имеет один фатальный недостаток. Я не могу иметь статический код уровня модуля, который использует эти строки, поскольку они, возможно, еще не были созданы. Я думал о (а) и фактически использовал подобный трюк при сериализации объекта, отправлял индекс, а не строку, но для решения общего назначения он представлял собой много сантехники. Так грустно (c) выигрывает, нет простой const idiom для std: string