如何填充循环模板派生类的静态成员?

时间:2019-01-03 21:30:42

标签: c++ qt templates crtp

我有这个课程(裸露的骨头):

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 = {
    // ...
};

1 个答案:

答案 0 :(得分:0)

您需要定义静态变量,因此,是的,对于每种类型,都需要使用以下内容进行定义:

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

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