嵌入式中的多种变体类型映射
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;
我正在开发一个嵌入式应用程序,因此需要一些精简的东西。我正在使用地图来存储参数。这些将是 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;