繁体   English   中英

C++ 容器类型面临从 map 转换等问题<long unsigned int, ..>到非标量类型 map<short unsigned int, ..></short></long>

[英]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

相反,您必须执行以下两个选项之一:

  1. 只需在 layoutJson 中使用现有的 map 类型layoutJson 这是最好的选择,因为开销更少,并且诸如“如果密钥不适合 uint16_t 会发生什么?”之类的极端情况也更少。 您可以使用auto来避免查找和输入长类型名称:

     auto output = layoutJson["MapUInt64String16VectFloat64ReqProvOp"]["value"];
  2. 如果您不能执行 #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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM