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

3

让我们考虑这种模板:

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[]类型的字符串文字连接的运算符。
如何强制字符串文字匹配所需的字符类型? 我必须为表示字面值的常量提供专门化吗(这会产生大量样板代码)?还是有现成的工具可以用? 实时示例

2
这让我想到了:如何在由用于表示字面值的字符类型参数化的模板中表示字符串字面值? - Geezer
@SkepticalEmpiricist 这是一个解决方案。不太好看,但它会起作用。我还想到了类似于这样的东西(https://wandbox.org/permlink/hUSQoiKbGsS6fUcU),我不喜欢它,但它更适合我的需求(测试代码)。 - Marek R
你能使用C++17吗?我有一个解决方案,虽然不是最漂亮的,但至少所有代码都在一个函数中。基本上它将使用if constexp - NathanOliver
是的,我可以使用C++17,你的解决方案只是第一条评论中链接答案的小改进。 - Marek R
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接