【问题标题】:How to populate static members of recurring template derived class?如何填充循环模板派生类的静态成员?
【发布时间】:2019-01-03 21:30:41
【问题描述】:

我有这门课(简体版):

class Background : public QObject
{
        Q_OBJECT
    public:
        static const QMetaObject *index(const QString &name) { return m_indexes.value(name, nullptr); }
        static const QList<QString> names() { return m_indexes.keys(); } }

    protected:
        explicit Background(QObject *parent = nullptr) : QObject(parent) {}

    private:
        static const QMap<QString, const QMetaObject *> m_indexes;
};

因为我将很少有其他类具有完全相同的基本结构,多态性很明显,但我需要static const m_indexes 对每个派生类都是唯一的,我发现我可以使用循环模板来做我想做的事需要,但我不知道如何在编译时“填充”我唯一的静态 const 成员。

template<class T>
class Base {
    // ...
    static const QMap<QString, const QMetaObject *> m_indexes;
}

template<class T> const QMap<QString, const QMetaObject *> Base<T>::m_indexes;

这是我从 CRTP 得到的,但它会以同样的方式初始化它们,我如何在每个派生类中让 m_indexes 拥有唯一的条目。?

类似的东西:

class Background : public QObject, public Base<Background>
{
        Q_OBJECT
    public:
        explicit Background (QObject *parent = nullptr) : 
            QObject(parent), Base<Background>() {}    
};

const QMap<QString, const QMetaObject *> Base<Background>::m_indexes = {
    // ...
};

【问题讨论】:

    标签: c++ qt templates crtp


    【解决方案1】:

    你需要定义静态变量,所以是的,对于每种类型,你需要定义它:

    const QMap<QString, const QMetaObject *> Base<Background>::m_indexes = {/**/};
    

    仅声明模板 m_indexes 不会实例化符号,模板的老问题相同!

    【讨论】:

    • 但是我应该在哪里做呢?因为我试过了,但我无法让它工作。
    • 在一个cpp文件中,你需要定义所有这些m_indexes
    • 好的,它正在工作,非常感谢。我是如此接近,但我无法让它工作,真气:)
    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多