¿Es posible crear un constructor (o firma de función, para el caso) que solo acepta una cadena literal, pero no una letra p. char const *
?C++: Constructor aceptando solo una cadena literal
¿Es posible tener dos sobrecargas que puedan distinguir entre literales de cadena y char const *
?
C++ 0x permitiría esto con un sufijo personalizado, pero estoy buscando una solución "anterior".
Justificación: evitando la copia del montón de cadenas que no se modificarán cuando se den como literales de cadena.
Estas cadenas van directamente a una API esperando un const char *
sin ningún procesamiento. La mayoría de las llamadas usan literales que no requieren procesamiento adicional, solo que en unos pocos casos se construyen. Estoy buscando la posibilidad de preservar el comportamiento de llamadas nativas.
Nota: - ya que viene en las respuestas: el código en cuestión no utiliza std::string
en absoluto, pero es un buen ejemplo sería:
class foo
{
std::string m_str;
char const * m_cstr;
public:
foo(<string literal> s) : m_cstr(p) {}
foo(char const * s) : m_str(s) { m_cstr = s.c_str(); }
foo(std::string const & s) : m_str(s) { m_cstr = s.c_str(); }
operator char const *() const { return m_cstr; }
}
Resultados:
(1) no se puede hacer.
(2) Me di cuenta de que ni siquiera estoy buscando un literal, sino una constante de tiempo de compilación (es decir, "todo lo que no necesita copiarse").
que probablemente utilice el siguiente patrón en su lugar:
const literal str_Ophelia = "Ophelia";
void Foo()
{
Hamlet(str_Ophelia, ...); // can receive literal or string or const char *
}
con un simple
struct literal
{
char const * data;
literal(char const * p) : data(p) {}
operator const char *() const { return data; }
};
que no se detiene a nadie de abusar de ella (que debería encontrar un mejor nombre ...) , pero permite la optimización requerida, pero permanece seguro por defecto.
Yo no lo creo, ya que 'string' tiene un constructor que toma un 'char const *'. –
¿Podría explicar el razonamiento? No puedo entender por qué querría copiar un literal de cadena, pero NO copiar un 'const char *' (o al revés). No puedes cambiar ambos exactamente de la misma manera. – Hexagon
También deberá mantener un indicador y tener un código condicional en su destructor. Parece que tendrías que crear muchos más objetos usando cadenas literales de lo que normalmente hago para que esto valga la pena. –