【问题标题】:Qt C++: How to store function pointer in map when function have different parameter typeQt C++:当函数具有不同的参数类型时如何将函数指针存储在映射中
【发布时间】:2015-11-03 04:30:12
【问题描述】:

我正在尝试像这样实现一种[自我描述实体]

//entity.h
class Entity : public QObject
{
    Q_OBJECT
    Q_PROPERTY(long Id READ Id WRITE setId NOTIFY IdChanged)
    Q_PROPERTY(QString Text READ Text WRITE setText NOTIFY TextChanged)

private:
    long _id;
    QString _text;

    typedef void (Entity::*LongFnPtr)(long);
    std::map<std::string, LongFnPtr> longSetter;

    typedef void (Entity::*StringFnPtr)(QString);
    std::map<std::string, StringFnPtr> stringSetter;

public:

    Entity();

    void SetValue(std::string propName, long value);
    void SetValue(std::string propName, QString value);

    //Id Property
    long Id();
    void setId(long id);

    //Text Property
    QString Text();
    void setText(QString text);
}

//entity.cpp
Entity::Entity()
{
    this->longSetter["Id"] = &Entity::setId;
    this->stringSetter["Text"] = &Entity::setText;

}

long Entity::Id(){
    return _id;
}

void Entity::setId(long id){
    _id = id;
}

QString Entity::Text(){
    return _text;
}

void Entity::setText(QString text){
    _text = text;
}

void Entity:SetValue(std::string propName, long value){
    if (longSetter[propName]){
        (this->*longSetter[propName](value)
    }
}

void Entity:SetValue(std::string propName, QString value){
    if (stringSetter[propName]){
        (this->*stringSetter[propName](value)
    }
}

我的两个问题是:

  1. 如何为所有不同的数据类型创建 1 个函数指针和 propSetter 映射
  2. 我知道函数指针签名是特定于实体类的。如何将此实体类用作基类并将这些 SetValue 函数重用于派生类的属性设置器?

【问题讨论】:

  • 看起来您正在重新编码 Qt 属性系统,但没有真正解释为什么要这样做,因为它已经到位,可能是 Qt 属性系统不适用于的原因你? Qt Property System上的Docs相当不错,注意Reading an Writing属性
  • 你救了我的命……真是个菜鸟问题……! :D 我刚刚开始学习 Qt 几天并尝试为我的项目构建 ORM。不知道这个属性系统存在!非常感谢和尊重!!! :)

标签: c++ qt function pointers dictionary


【解决方案1】:

非常感谢The Badger !!!

从没想过它已经存在。

只需使用 setProperty 函数

Enity *obj = new Entity();
obj->setProperty("Id", 1);
obj->setProperty("Text", "Some text");

感觉自己很蠢!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多