Теперь, будучи хорошим разработчиком, я ненавижу как встроенные литералы, так и дублирование кода.
Я пытался написать это:
Код: Выделить всё
template
constexpr const CharType* HELLO_WORLD = "Hello World!";
Мне бы хотелось такого решения:
Код: Выделить всё
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