У меня есть утилита под названием choose_literal
, которая выбирает буквенную строку, закодированную как char*, wchar_*, char8_t*, char16_t*, char32_t*
, в зависимости от желаемого типа (выбор).
Это выглядит так:
template <typename T>
constexpr auto choose_literal(const char * psz, const wchar_t * wsz, const CHAR8_T * u8z, const char16_t * u16z, const char32_t * u32z) {
if constexpr (std::is_same_v<T, char>)
return psz;
if constexpr (std::is_same_v<T, wchar_t>)
return wsz;
#ifdef char8_t
if constexpr (std::is_same_v<T, char8_t>)
return u8z;
#endif
if constexpr (std::is_same_v<T, char16_t>)
return u16z;
if constexpr (std::is_same_v<T, char32_t>)
return u32z;
}
Я предоставляю небольшой макрос препроцессора, чтобы сделать эту работу без необходимости вручную вводить каждую из этих кодировок:
// generates the appropriate character literal using preprocessor voodoo
// usage: LITERAL(char-type, "literal text")
#define LITERAL(T,x) details::choose_literal<T>(x, L##x, u8##x, u##x, U##x)
Это, конечно, работает только для литеральных строк, которые могут быть закодированы компилятором в целевом формате, но может быть что-то вроде пустой строки, как и символы ASCII (например, az, 0-9 и т. Д., Которые имеют представления). во всех этих кодировках).
например. вот тривиальный бит кода, который вернёт правильную пустую строку, если указан правильный тип символа 'T':
template <typename T>
constexpr const T * GetBlank() {
return LITERAL(T, "");
}
Это замечательно, насколько это возможно, и это работает достаточно хорошо в моем коде.
Что я хотел бы сделать, так это изменить его так, чтобы я возвращал массив символов, включая его размер, как если бы я написал что-то вроде:
const char blank[] = "";
или
const wchar_t blank[] = L"";
Что позволяет компилятору знать длину строкового литерала, а не только его адрес.
My choose_literal<T>(str)
возвращает только const T *
, а не const T (&)[size]
, что было бы идеально.
В общем, я бы хотел иметь возможность передавать такие объекты без изменений, а не превращать их в один указатель.
Но в этом конкретном случае есть метод, на который вы могли бы указать мне, который позволяет мне объявлять структуру с членом-членом для желаемой кодировки, которая также знает длину своего массива?