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

时间:2018-09-20 11:35:35

标签: c++ templates

让我们考虑这种模板:

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[]的字符串文字连接起来。

如何强制字符串文字匹配所需的字符类型? 我是否必须提供代表文字常量的专业化(这么多样板代码)?还是有现成的工具?

Live sample

1 个答案:

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