如何填充循环模板派生的静态成员class?
How to populate static members of recurring template derived class?
我有这个class(基本版本):
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;
};
因为我几乎没有其他 class 具有完全相同的基本结构,多态性是显而易见的,但我需要的是 static const m_indexes
对于每个派生的 class 都是唯一的,我发现我可以使用循环模板来做我需要的事情,但我无法找到如何在编译时 "populate" 我的唯一静态常量成员。
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 得到的,但它会以相同的方式初始化它们,我如何才能在每个派生 class 中让 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
不会实例化符号,与模板相同的老问题!
我有这个class(基本版本):
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;
};
因为我几乎没有其他 class 具有完全相同的基本结构,多态性是显而易见的,但我需要的是 static const m_indexes
对于每个派生的 class 都是唯一的,我发现我可以使用循环模板来做我需要的事情,但我无法找到如何在编译时 "populate" 我的唯一静态常量成员。
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 得到的,但它会以相同的方式初始化它们,我如何才能在每个派生 class 中让 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
不会实例化符号,与模板相同的老问题!