嵌入式中的多种变体类型映射

Multiple variant types map in embedded

我正在开发一个嵌入式应用程序,因此需要一些精简的东西。我正在使用地图来存储参数。这些将是 int 或 float 数据类型。我哪里做错了?

#include <string.h>

class parameter_types {
    typedef int parameter_int;
    typedef float parameter_float;
};

std::map<std::string, parameter_types*> mymap;

int map_test(char* return_string) {
  mymap["Circle"] = (int)1;
  mymap["Wibble"] = (float)0.4567;
  mymap["Triangle"] = 3.3;
  mymap["Square"] = 4;

  return 1;
}

我收到以下编译器错误: 错误:无法将 "int" 类型的值分配给 "parameter_types *"

类型的实体

我确定这是一个基本错误,但我没有看到。

谢谢!

这里是语法错误。

理论上,您需要手动设置类型并将它们存储为属性:

class parameter_type
{
    int parameter_int;
    float parameter_float;
}

mymap["Circle"] = new parameter_type;
mymap["Circle"]->parameter_int = 10;

但是,我不认为这是你想要做的。

那么,如果你需要存储一个变体类型,你有多种选择:

  • 您可以使用像 Boost 一样完成所有类型工作的库(Boost.Variant 或 Boost.Any)
  • 您可以使用模板正确实现 Variant。

至于第二个,我建议您查看此答案 SO: Implementing a "variant" class 可以解决您的问题。

好吧,你告诉编译器 mymap 是一个将 std::string 键映射到 parameter_types 值的映射。然而 mymap["Circle"] = (int)1; 告诉编译器将一个 int 值放在 std::string 键下,这当然不能,因为值类型是 parameter_types。您必须将 int 放入 parameter_types 的实例中(此时它没有任何成员字段,因此您必须添加它们)然后它才会起作用。

作为一种可能的解决方案,您可以在 class 中使用 union,如下所示:

class parameter_types {
    typedef int parameter_int;
    typedef float parameter_float;
    union value
    {
        parameter_int int_value;
        parameter_float float_value;
    };
};

parameter_types parameter;
parameter.value.int_value = 3;