首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套模板类调用模板函数

嵌套模板类调用模板函数
EN

Stack Overflow用户
提问于 2017-12-13 18:06:48
回答 1查看 82关注 0票数 0

这是我的项目的简化代码。

首先,我有一个模板类:

代码语言:javascript
复制
template<typename T>
class Base : public QObject{
public:

    void createTemp(){
        qDebug()<<(new T)->metaObject()->className();
    }

    void* mCreateTemp;

    Base(){
        mCreateTemp = (void*)(&Base::createTemp);
    }
};

然后是两种类型的类TempATempB

代码语言:javascript
复制
class TempA : public QObject{
    Q_OBJECT
};

class TempB : public QObject{
    Q_OBJECT
};

Base派生出的两个类AB

代码语言:javascript
复制
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))();
    }
};

输出:

代码语言:javascript
复制
Problem wrong answer:
TempB
Soluation:
TempA

简化问题:我正尝试在B类中这样做:

代码语言:javascript
复制
A* test = new A;
((Base*)test)->createTemp();

我希望创建TempA

我已经得到了解决方案,将函数存储为指针,但想知道其他更好的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 18:44:10

使用一个真正的基类怎么样:

代码语言:javascript
复制
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();
        }
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47790285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档