Как избежать дублирования текста строкового литерала в функциях, которые принимают символы/строки разной ширины?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как избежать дублирования текста строкового литерала в функциях, которые принимают символы/строки разной ширины?

Сообщение Anonymous »

Мне часто приходится создавать функции манипулирования строками на C++. Мои API, как правило, написаны так, чтобы принимать std::basic_string (эффективно), но я также хочу принимать std::basic_string_view, когда это имеет смысл. Было несколько проблем при принятии string_view, над которыми я работал, но с литералами я обнаружил только боль.
Теперь, будучи хорошим разработчиком, я ненавижу как встроенные литералы, так и дублирование кода.
Я пытался написать это:

Код: Выделить всё

template 
constexpr const CharType* HELLO_WORLD = "Hello World!";
Это не работает, особенно потому, что если CharType не char, мне нужен u или U или L там.
Мне бы хотелось такого решения:

Код: Выделить всё

template 
static const CharType* HELLO_WORLD = "Hello World!";
Моя текущая альтернатива требует макросов, которые создают структуры, специализирующиеся на макросах:

Код: Выделить всё

#define DEFINE_STRING_LITERAL(name, str)                 \
template                          \
struct name {};                                      \
\
template                                           \
struct name {                                  \
static constexpr const char* value = str;        \
};                                                   \
\
template                                           \
struct name {                               \
static constexpr const wchar_t* value = L##str;  \
};                                                   \
\
template                                           \
struct name {                              \
static constexpr const char16_t* value = u##str; \
};                                                   \
\
template                                           \
struct name {                              \
static constexpr const char32_t* value = U##str; \
};
Это определяется следующим образом:

Код: Выделить всё

DEFINE_STRING_LITERAL(HELLO_WORLD ,"value");
и используется следующим образом:

Код: Выделить всё

HELLO_WORLD::value
Все в порядке, я могу поместить макрос куда-нибудь в заголовок и забыть о нем. Но мне не нравится синтаксис определения. Это не похоже на определение, а затем пытаться найти, где оно определено, с помощью статических инструментов, если мне нужно его изменить, — это головная боль. Кроме того, он не выводит тип, что затрудняет чтение результирующего кода.
Компилятор знает, какие литеральные префиксы связаны с какими типами. Я знаю это, потому что он не скомпилируется, если я его испорчу. Итак, есть ли способ избежать этой специализации структур и получить что-то ближе к однострочнику, который я хотел бы видеть?
Если у кого-нибудь есть лучшее решение, которое больше похоже на стандарт C++ , вместо того, чтобы использовать макрос для определения типа на лету, это было бы здорово.
P.S. Вероятно, я мог бы создать класс констант, который имел бы собственный литеральный синтаксис и хранил бы символ char*, но тогда мне нужно было бы копировать строки, а не позволять компилятору управлять ими. Мне бы также хотелось, чтобы это были действительно статические литералы, поскольку я не могу использовать динамический const CharType* в качестве значений в параметрах шаблона.

Подробнее здесь: https://stackoverflow.com/questions/784 ... pt-differe
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»