Как заполнить статические члены повторяющегося шаблона производного класса? - PullRequest
0 голосов
/ 04 января 2019

У меня есть этот класс (голая версия):

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 голосов
/ 04 января 2019

Вам нужно определить статические переменные, поэтому да, для каждого типа вам нужно определить его с помощью:

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

Простое объявление шаблона m_indexes не создает экземпляр символа, такой же старыйпроблема с шаблонами!

...