Используйте строковые литералы внутри шаблона, который обрабатывает любые размеры символов

Давайте рассмотрим этот вид шаблона:

template<typename CharT>
std::basic_string<CharT> refEnvVaraiable(const std::basic_string<CharT> &varaibleName)
{
std::basic_string<CharT> result;
result.reserve(varaibleName.length() + 3);
result = "${" + varaibleName + "}";
return result;
}

План состоит в том, что это предполагает обработку строк с любым размером символов.
Это, конечно, не скомпилируется, если аргумент аргумент функции std::wstring поскольку нет оператора для конкатенации со строковым литералом типа const char[],

Как заставить строковый литерал соответствовать желаемому типу символов?
Должен ли я предоставлять специализации для констант, представляющих литералы (это много кода котельной пластины)? Или есть готовый инструмент для этого?

Живой образец

3

Решение

Одна вещь, которую вы можете сделать, это использовать if constexpr кодировать различные объединения, которые вы хотите поддерживать. Когда код скомпилирован, будет скомпилирована только действительная конкатенация, а остальные будут отброшены. Это даст вам что-то вроде

template<typename CharT>
std::basic_string<CharT> refEnvVaraiable(const std::basic_string<CharT> &varaibleName)
{
std::basic_string<CharT> result;
result.reserve(varaibleName.length() + 3);
if constexpr (std::is_same_v<CharT, char>) result = "${" + varaibleName + "}";
else if constexpr (std::is_same_v<CharT, wchar_t>) result = L"${" + varaibleName + L"}";
else if constexpr (std::is_same_v<CharT, char16_t>) result = u"${" + varaibleName + u"}";
else if constexpr (std::is_same_v<CharT, char32_t>) result = U"${" + varaibleName + U"}";
else static_assert(false, "refEnvVaraiable called with unsupported character type");
return result;
}
1

Другие решения

Других решений пока нет …