我遇到了一个设计问题,希望大家能帮忙解决。我有几个不同的类,它们有不同的参数(每种情况下超过 20 个,它们大多不同,尽管有些完全相同,在这种情况下它们从基类继承)。我想通过一个名为 ObjectProperties 的类的用户来控制这些参数。每个类都将创建 ObjectProperties 并在类初始化时用自己的参数列表填充它。这是通过如下设置的 map 完成的:
std::map<std::string, [data_type]> // where [data_type] can be an int, float, bool, string etc.
“字符串”是参数的名称,数据类型是与其关联的类型。这样做是为了以后轻松编写脚本(而不是拥有 20 多个 getter/setter)。我已经制作了 ObjectProperties 类,但它不太理想。我有一个结构,其中包含所有可能的数据类型,称为 DataTypeStruct,在 ObjectProperties 类中有一个映射变量,称为 pDataTypeMap;
typedef struct
{
int* IntValue;
float* FloatValue;
bool* BoolValue;
std::string* StringValue;
}DataTypeStruct;
std::map<std::string, DataTypeStruct> pDataTypeMap;
当一个类想要添加一个参数进行操作时,它会调用以下函数之一,然后该函数会适本地创建一个新结构并将其与要放入映射中的名称配对。该函数根据是否能够插入它返回 true 或 false(如果为 false,则该名称已经存在)
bool AddParam(std::string aName, int* aParam);
bool AddParam(std::string aName, float* aParam);
bool AddParam(std::string aName, bool* aParam);
bool AddParam(std::string aName, std::string* aString);
aParam 是/是指针的原因是因为要求参数必须通过引用传递,以便以后可以对其进行操作。
要更改参数的值,我有类似的功能。如您所见,这不太理想,因为我在结构上浪费了一些空间(其中每个新结构只存储一个 int 或 bool 或一个字符串或一个 float ),并且调用重载函数是不安全的(我可以' 使函数具有唯一的名称,但这又不太理想。
我希望我已经解释了我遇到的设计问题(解释起来有点困难)并且真的很想听听有关如何解决这个问题的建议。
最佳答案
我建议先看看 boost::any , boost:variant , boost::tuple或 boost::fusion::vector作为您 [data_type] 的“交通工具”。
关于c++ - 与操作未知类型相关的设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240005/