Можно ли создать конструктор (или, если уж на то пошло, сигнатуру функции), который только принимает строковый литерал, но не, например, char const *
Возможно ли иметь две перегрузки, которые могут различать строковые литералы и 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; }
};
Это не мешает никому злоупотреблять им (я должен найти более подходящее имя ...), но оно позволяет выполнить необходимую оптимизацию, но по умолчанию остается безопасным.