У меня есть этот класс (голая версия):
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 = {
// ...
};