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

How to populate static members of recurring template derived class?

本文关键字:派生 静态成员 循环 何填充 填充      更新时间:2023-10-16

我有这个类(裸露版本):

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

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

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

仅声明模板m_indexes不会实例化符号,模板的旧问题也是如此!