gpt4 book ai didi

c++ - Qt 和 C++ : Array of function pointers with different return and parameter types

转载 作者:行者123 更新时间:2023-11-28 01:22:07 25 4
gpt4 key购买 nike

我正在研究 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 中创建三个 map :

  • 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 不能解决这个问题(数组必须是相同的函数类型并且绑定(bind)使用已经预定义的值等)...我需要类似的东西到应用于变量的 (void *) 指针,但对于函数指针(使用类型映射,我认为我可以有效地将通用函数指针转换为所需的函数指针模板)。

有什么想法吗?

PD:对于一些代码问题或拼写错误,我们深表歉意,真正的代码要详细得多,我已经尽可能地简化和简化它。

最佳答案

看起来像Qt's Property System是您的完美解决方案:

class TableData : public QObject {
Q_OBJECT

public:
TableData() : QObject(), _id(0) {}

QVariant getFieldValue(const char * fieldName) const {
return property(fieldName);
}

void setFieldValue(const char * fieldName, QVariant _value) {
setProperty(fieldName, _value);
}

int id() const { return _id; }

void setId(int newID) {
_id = newID;
emit idChanged();
}

protected:
Q_PROPERTY(int id
READ id
WRITE setId
NOTIFY idChanged)
int _id;

signals:
void idChanged();
};
class EmployeeData : public TableData {
Q_OBJECT

public:
EmployeeData() : TableData(), _age(-1), _name("") {}

int age() const { return _age; }

void setAge(int newAge) {
_age = newAge;
emit ageChanged();
}

QString name() const { return _name; }

void setName(QString newName) {
_name = newName;
emit nameChanged();
}

protected:
Q_PROPERTY(int age
READ age
WRITE setAge
NOTIFY ageChanged)
int _age;

Q_PROPERTY(QString name
READ name
WRITE setName
NOTIFY nameChanged)
QString _name;

signals:
void ageChanged();
void nameChanged();
};

void TableData::setField(const char *, QVariant); 方法将调用 void QObject::setProperty(const char *, QVariant);。最后一个将自动调用您在 WRITE 属性字段中指定的 setter 以更新属性值。下面三段代码做同样的事情:

使用属性的 setter :

EmployeeData ed;
ed.setId(5);
ed.setAge(11);
ed.setName("Son Gohan");

使用 void TableData::setField(const char *, QVariant);:

EmployeeData ed;
ed.setField("id", 5);
ed.setField("age", 11);
ed.setField("name", "Son Gohan");

使用 void QObject::setProperty(const char *, QVariant);(因为你的 EmployeeData 也是一个 QObject):

EmployeeData  ed;
ed.setProperty("id", 5);
ed.setProperty("age", 11);
ed.setProperty("name", "Son Gohan");

读取属性也是一样。您的 QVariant TableData::getField(const char *) const; 方法将调用 QVariant QObject::property(const char *) const;。这最后一个将自动调用您在 READ 属性字段中指定的 getter 以检索属性值。下面三段代码做同样的事情:

使用属性的 setter :

// Using the EmployeeData ed defined above
int id = ed.id(); // id == 5
int age = ed.age(); // age == 11
QString name = ed.name(); // name == "Son Gohan"

使用 QVariant TableData::getField(const char *) const;:

// Using the EmployeeData ed defined above
int id = ed.getField("id").toInt(); // id == 5
int age = ed.getField("age").toInt(); // age == 11
QString name = ed.getField("name").toString(); // name == "Son Gohan"

使用 QVariant QObject::property(const char *) const;(因为您的 EmployeeData 也是一个 QObject):

// Using the EmployeeData ed defined above
int id = ed.property("id").toInt(); // id == 5
int age = ed.property("age").toInt(); // age == 11
QString name = ed.property("name").toString(); // name == "Son Gohan"

关于c++ - Qt 和 C++ : Array of function pointers with different return and parameter types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55659847/

25 4 0