[英]C++ container types facing an issue like conversion from map<long unsigned int, ..> to non scalar type map<short unsigned int, ..>
std::map<uint16_t, std::u16string> val = layoutJson["MapUInt64String16VectFloat64ReqProvOp"]["value"];
// string16 to string conversion
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convertor;
std::string actualData = convertor.to_bytes(val.begin()->second);
//ERROR
std::map<uint16_t, std::u16string> receivedData = operationMapUInt64String16VectFloat.GetResult();
CK_EQ(actualData, convertor.to_bytes(receivedData.begin()->second));
我已经尝试了很多方法来解决这个问题,并且我声明数据类型的地方都是相同的。 我仍然遇到问题
如果您想将一个 map 直接分配给另一个,它们不能有不同的键和值类型:
std::map<uint64_t, std::u16string> input;
std::map<uint16_t, std::string> output = input; // error, key and value types are different
相反,您必须执行以下两个选项之一:
只需在 layoutJson 中使用现有的 map 类型layoutJson
。 这是最好的选择,因为开销更少,并且诸如“如果密钥不适合 uint16_t 会发生什么?”之类的极端情况也更少。 您可以使用auto
来避免查找和输入长类型名称:
auto output = layoutJson["MapUInt64String16VectFloat64ReqProvOp"]["value"];
如果您不能执行 #1,则必须将 map 元素逐个元素复制到新的 map 中,将每个元素转换为新类型。 一种惯用的方法是std::transform
。 您将输入容器、output 容器和 function 传递给它以转换每个元素:
std::map<uint64_t, std::u16string> input = /*... */; std::map<uint16_t, std::string> output; std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter; std::transform( input.begin(), input.end(), std::inserter(output, output.end()), [&converter](auto& p) { return std::make_pair( static_cast<uint16_t>(p.first), // you probably want to check this converter.to_bytes(p.second)); });
就个人而言,有时我发现<algorithm>
中的内容很难阅读。 手动循环也没有错:
std::map<uint64_t, std::u16string> input = /*... */; std::map<uint16_t, std::string> output; std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter; for (auto& p: input) { output.insert( std::make_pair( static_cast<uint16_t>(p.first), // you probably want to check this converter.to_bytes(p.second))); }
仅供参考,从 C++17 起, <codecvt>
现在已弃用,并且可能会在以后的标准中被删除。 您可能需要考虑使用众多库中的一个来进行编码转换,而不是使用标准库(就像该建议听起来很奇怪)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.