有一种方法返回自定义结构从一个函数在c++ ?



我想知道是否有可能以某种方式从函数返回自定义结构体。

实际用例:我有一个字符串形式的字典,用一些分隔符分隔。例如:一个FIX消息:"8=FIX.4.4,8=MKT…",在解析此消息时,我想要提取这些键值对,理想情况下以结构体的形式:{8:FIX.4.4…},我可以为所有消息设置一个通用的函数吗?什么数据结构可以是可能的返回类型?

用例似乎适合于映射,但由于所有值的类型可能不同,所以我排除了它。我想获得各自类型的数据,即,int作为int,字符串作为字符串,看到键我可以预先确定预期的类型,例如:34预计是一个整数,8预计是一个字符串等。如果你们能分享你们的想法就太好了。

提前感谢!

正如在注释中所说,您可以将数据存储在变体映射中:

#include <iostream>
#include <map>
#include <variant>
using std::cout, std::endl;
using var_t = std::variant<int, std::string, float, double>;
int main()
{
std::map<int, var_t> myMap {
{ 10,  "hello world" },
{ 1,   5 },
{ 25,  1.0f },
{ 100, -8e20 },
};
// 1
for (const auto& [key, value]: myMap) {
cout << "[" << key << ": ";
if (auto i_ptr = std::get_if<int>(&value)) {
cout << *i_ptr;
} else if (auto str_ptr = std::get_if<std::string>(&value)) {
cout << *str_ptr;
} else if (auto f_ptr = std::get_if<float>(&value)) {
cout << *f_ptr;
} else if (auto d_ptr = std::get_if<double>(&value)) {
cout << *d_ptr;
}
cout << "]n";
}
cout << endl << endl;
// 2
for (const auto& [key, value]: myMap) {
std::visit([&key](auto& v) {
cout << "[" << key << ": " << v << "]n";
}, value);
}

return 0;
}

https://godbolt.org/z/1PhYfq4hs

要访问存储在变量中的数据,可以执行

  1. 测试各电位类型与std::get_ifstd::hold_alternative+std::get也是一种选择。

  1. 创建一个访问者(lambda)并将其传递给std::visit,沿着您的变体

见:https://en.cppreference.com/w/cpp/utility/variant/

作为一种编译语言,您不能在运行时根据数据做出类型决定。因此,关键问题是在编译代码时,您对类型了解多少。

  • 如果你知道确切的类型,这只是一个模板化的函数
  • 如果您在编译时知道可能的类型列表,则这是map<变体,变体>
  • 如果类型可能由其他类型组成,那么您正在考虑使用库(如JSON)

所以,最通用的解决方案是返回一个JSON文档。只要您想要的数据可以表示为JSON。其他库也可用

一个更原生的方法是使用std::variant,它允许你说"这是可能类型的完整列表";(在编译时)。实际使用哪种类型可以在读取文件时决定。

---- BUT ----

请注意计算的基本定律之一,即程序能做的事情越多,它就会越复杂。一个常见的经验法则是,你能做的最好的方法是保持复杂度为特征数量的平方。所以映射<变量><int,float>变量<int,float>>比map<type1,type2>难4倍。添加JSON处理意味着注入无限数量的类型。这意味着您永远无法测试所有可能的类型。您的程序现在无法测试了!在实践中,当您处理JSON文档时,您要做的第一件事是拒绝不符合某些标准的文档,限制您必须处理的合法类型的数量,使再次测试成为可能。

最新更新