【发布时间】:2019-04-12 21:47:39
【问题描述】:
我正在开发 C++ 11、Qt 5.12。我需要将函数指针存储在某个映射或数组中。关键是,这些方法有不同的返回类型和参数类型。
我在类中定义了一些简单的数据结构。这是一个尽可能简单的示例:
class TableData
{
public:
enum EnumFieldType
{
FieldType_None = 0,
FieldType_Int,
FieldType_QString
};
enum EnumFieldId
{
FieldId_None = 0,
FieldId_Id,
MaxSystemFieldId = 64
};
int id() const;
void setId(const int _id);
QVariant getFieldValue(int _fieldId);
void setFieldValue(int _fieldId, QVariant _value)
protected:
int id_;
//Here some QMap or QVector with the function pointers
}
class EmployeeData : public TableData
{
public:
enum EnumFieldId
{
FieldId_Name = TableData::MaxSystemFieldId + 1,
FieldId_Age
};
QString name() const;
int age() const;
void setName(const QString &_name);
int setAge(const Int &_age);
protected:
int age_;
QString name_;
}
想法是在TableData中创建三个地图:
- QMap mapFieldTypes
- QMap mapGetters
- QMap
这些映射将填充到 TableData 子类的构造函数中。因此,一旦构建了子类的实例,我就可以使用:
EmployeeData ed;
ed.setId(5);
ed.setAge(11);
ed.setName("Son Gohan");
或者:
EmployeeData ed;
ed.setField(EmployeeData::FieldId_Id, 5);
ed.setField(EmployeeData::FieldId_Age, 11);
ed.setField(EmployeeData::FieldId_Name, "Son Gohan");
最后这些调用转到 TableData::SetField 方法,该方法应使用 FieldId 键查看映射 mapFieldTypes 以获得字段的类型;然后获取 setter 函数指针并使用正确转换为 setter 函数请求的类型的 QVariant 参数调用它。
我花了很多时间来解决这个问题,阅读、寻找和寻找一些解决方案。指针或回调数组必须是相同的函数类型,std::function 和 std::bind 不能解决这个问题(数组必须是相同的函数类型并且绑定使用已经预定义的值等)......我需要类似的东西到应用于变量的 (void *) 指针,但对于函数指针(使用类型映射,我认为我可以有效地将泛型函数指针转换为所需的函数指针模板)。
有什么想法吗?
PD:对于一些代码问题或拼写错误,我们深表歉意,真正的代码要详细得多,我已尝试尽可能简化和简化它。
【问题讨论】: