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