gpt4 book ai didi

c++ - 将 std::u16string 转换为 std::wstring 而不复制

转载 作者:行者123 更新时间:2023-11-30 03:26:49 33 4
gpt4 key购买 nike

我做了一堆UTF转换函数,接口(interface)如下:

template <typename T, typename U> std::basic_string<T> UTFConvert(std::basic_string_view<U> a_String);

charchar16_tchar32_t 的所有组合都有实现。但现在我还需要添加对 wchar_t 的支持。我在编译时知道 wchar_t 的大小,所以理论上我可以用相同大小的字符调用该函数。

问题是我必须将结果字符串复制回 std::wstring。例如,如果 sizeof(wchar_t) == 2 我最终会做这样的事情:

template <typename T, typename U>
std::enable_if_t<std::is_same_v<T, wchar_t>, std::basic_string<T>> UTFConvert(std::basic_string_view<U> a_String)
{
const std::u16string utf16 = UTFConvert<char16_t>(a_String);

std::wstring wstr;
wstr.resize(utf16.size());
memcpy(wstr.data(), utf16.data(), utf16.size() * sizeof(wchar_t));

return wstr;
}

这样复制字符串似乎有点浪费。有没有办法避免这种情况,而无需为不同的类型重新实现相同的代码两次?

最佳答案

问题已通过专门针对 T 的大小而不是特定字符类型的函数解决:

template <typename T, typename U>
std::enable_if_t<sizeof(T) == 2, std::basic_string<T>> UTFConvert(std::basic_string_view<U> a_String);

只需在其中添加一些 static_assert 以保持理智,一切都会完美无缺!

感谢@MassimilianoJanes 的建议。

关于c++ - 将 std::u16string 转换为 std::wstring 而不复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47980157/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com