Давайте рассмотрим этот вид шаблона:
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[]
,
Как заставить строковый литерал соответствовать желаемому типу символов?
Должен ли я предоставлять специализации для констант, представляющих литералы (это много кода котельной пластины)? Или есть готовый инструмент для этого?
Одна вещь, которую вы можете сделать, это использовать 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;
}
Других решений пока нет …