这是我的项目的简化代码。
首先,我有一个模板类:
template<typename T>
class Base : public QObject{
public:
void createTemp(){
qDebug()<<(new T)->metaObject()->className();
}
void* mCreateTemp;
Base(){
mCreateTemp = (void*)(&Base::createTemp);
}
};然后是两种类型的类TempA和TempB:
class TempA : public QObject{
Q_OBJECT
};
class TempB : public QObject{
Q_OBJECT
};从Base派生出的两个类A和B
class A : public Base<TempA>{
Q_OBJECT
};
class B : public Base<TempB>{
public:
B(){
A* a = new A;
QVariant v = QVariant::fromValue(a);
//This v is actually passed from QML
QObject* aa = v.value<QObject*>();
// I don't want do (A*)a in my project.
qDebug()<<"Problem wrong answer:";
((Base*)(aa))->createTemp();
qDebug()<<"Soluation:";
((void(*)())(((Base*)(aa))->mCreateTemp))();
}
};输出:
Problem wrong answer:
TempB
Soluation:
TempA简化问题:我正尝试在B类中这样做:
A* test = new A;
((Base*)test)->createTemp();我希望创建TempA。
我已经得到了解决方案,将函数存储为指针,但想知道其他更好的方法。
发布于 2017-12-13 18:44:10
使用一个真正的基类怎么样:
class Base : public QObject
{
public:
virtual void print() const = 0;
};
template<typename T>
class Wrapper : public Base
{
public:
void print() const override {
std::cout << typeid(T).name << std::endl;
// T t;
// qDebug()<< t.metaObject()->className();
}
};
class TempA : public QObject{ Q_OBJECT };
class TempB : public QObject{ Q_OBJECT };
class A : public Wrapper<TempA>{ Q_OBJECT };
class B : public Wrapper<TempB>
{
public:
B(){
A a;
QVariant v = QVariant::fromValue(&a); //This v is actually passed from QML
QObject* aa = v.value<QObject*>();
auto* base = dynamic_cast<Base*>(aa);
if (base) {
base->print();
}
}
};https://stackoverflow.com/questions/47790285
复制相似问题