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