在处理任何字符大小的模板中使用字符串文本

Use string literals inside template which handles any char sizes

本文关键字:文本 字符串 任何 处理 字符      更新时间:2023-10-16

让我们考虑这种模板:

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;
}