Tengo un mapa que representa un objeto DB. Quiero obtener los valores de los conocidos 'de ellaidioma correcto para std :: string constants?
std::map<std::string, std::string> dbo;
...
std::string val = map["foo"];
todo bien, pero se me ocurre que "foo" se convierte en una cadena temporal en cada llamada. Seguramente sería mejor tener una std :: string constante (por supuesto, es probablemente una pequeña sobrecarga en comparación con el disco IO que acaba de obtener el objeto, pero sigue siendo una pregunta válida, creo). Entonces, ¿cuál es la expresión correcta para std :: string constants?
por ejemplo - que puede tener
const std::string FOO = "foo";
en un HDR, pero luego obtener múltiples copias
EDIT: Aún no hay respuestas ha dicho cómo declarar constantes std :: string. Ignora todo el problema del mapa, STL, etc. Una gran cantidad de código es muy std :: string oriented (la mía ciertamente lo es) y es natural querer constantes para ellos sin pagar una y otra vez por la asignación de memoria
EDIT2: sacó la pregunta secundaria respondida por PDF de Manuel, ejemplo adicional de mala expresión
EDIT3: Resumen de respuestas. Tenga en cuenta que no he incluido aquellos que sugirieron crear una nueva clase de cadena. Estoy decepcionado porque esperaba que hubiera algo simple que funcionaría solo en el archivo de encabezado (como const char * const). De todos modos
a) de Marca b
std::map<int, std::string> dict;
const int FOO_IDX = 1;
....
dict[FOO_IDX] = "foo";
....
std:string &val = dbo[dict[FOO_IDX]];
b) de Vlad
// str.h
extern const std::string FOO;
// str.cpp
const std::string FOO = "foo";
c) de Roger P
// really you cant do it
(b) parece el más cercano a lo que quería pero tiene un defecto fatal. No puedo tener un código de nivel de módulo estático que use estas cadenas ya que es posible que aún no se hayan construido. Pensé en (a) y, de hecho, utilizar un truco similar al serializar el objeto, enviar el índice en lugar de la cadena, pero parecía una gran cantidad de plomería para una solución de propósito general. Así que por desgracia (c) ha sufrido, no hay sencilla idioma const para std: cadena
En la edición, traté de abordar eso ("no, así no es como std :: string funciona" y "aquí hay otra clase de cadenas"), pero tenga en cuenta que si simplemente desea almacenar const std :: strings en alguna parte como globales, solo tendrías que pagar por la asignación una vez (al inicio del programa) con una implementación ref-contada (que proporciona gcc y el estándar explícitamente permite). Solo asegúrese de que esos valores globales * const * eviten fácilmente todo tipo de errores lógicos. –
, por lo que su respuesta fue: no es posible. No estaba claro. Si a nadie se le ocurre una mejor respuesta, entonces obtienes la marca – pm100
. En realidad, me gusta la respuesta de Manuel actualmente. Disculpas por no haber sido lo suficientemente clara, por eso hice el comentario, pero también cogí otra opción por accidente. :) –