Можно ли создать конструктор (или подпись функции, если на то пошло), что только принимает строковый литерал, но не такой, например. char const *
?C++: конструктор, принимающий только строковый литерал
Возможно ли иметь две перегрузки, которые могут различать строковые литералы и char const *
?
C++ 0x мог бы сделать это с помощью специального суффикса - но я ищу «более раннее» решение.
Обоснование: избегая кучи копий строк, которые не будут изменены при указании в виде строковых литералов.
Эти строки непосредственно переходят к API, ожидающему const char *
без какой-либо обработки. В большинстве вызовов используются литералы, не требующие дополнительной обработки, только в нескольких случаях они построены. Я ищу возможность сохранить поведение нативного вызова.
Примечание: - так как он приходит в ответах: код в вопросе не использует std::string
вообще, но хороший пример был бы:
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; }
}
Результаты:
(1) не может быть сделано.
(2) Я понял, что даже не ищу литерала, но для константы времени компиляции (т. Е. «Ничего, что не нужно копировать»).
Я, вероятно, использовать следующий шаблон вместо:
const literal str_Ophelia = "Ophelia";
void Foo()
{
Hamlet(str_Ophelia, ...); // can receive literal or string or const char *
}
с простой
struct literal
{
char const * data;
literal(char const * p) : data(p) {}
operator const char *() const { return data; }
};
Это не останавливает никого злоупотреблять (я должен найти лучшее название ...) , но он обеспечивает требуемую оптимизацию, но по умолчанию остается безопасной.
Я не думаю, что это так, так как 'string' имеет конструктор, который принимает a char const *. –
Не могли бы вы рассказать об обосновании? Я не могу понять, почему вы хотели бы скопировать строковый литерал, но НЕ копировать 'const char *' (или наоборот). Вы не можете изменить оба точно таким же образом. – Hexagon
Вам также нужно будет поддерживать флаг и иметь условный код в вашем деструкторе. Кажется, вам придется создавать намного больше объектов, используя строковые литералы, чем я обычно делаю, чтобы сделать это стоящим. –