让我们考虑这种模板:
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[]
的字符串文字连接起来。
如何强制字符串文字匹配所需的字符类型? 我是否必须提供代表文字常量的专业化(这么多样板代码)?还是有现成的工具?
答案 0 :(得分:1)
您可以做的一件事是利用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;
}