使用CRTP(奇怪的循环模板模式),您可以提供一个基类,并提供从它派生的类的知识。创建一个数组来存储从基类派生的每个类的示例并不是那么困难(参见示例)
class Base{
public:
static std::vector<Base *> m_derivedInstances;
};
template <class Derived>
class CRTPBase : public Base {
public:
static bool m_temp;
static bool addInstance()
{
m_derivedInstances.push_back(new Derived);
return true;
}
};
template <class Derived>
CRTPBase<Derived>::m_temp = CRTPBase<Derived>::addInstance();
字符串
我想知道是否可以创建一个包含所有派生类类型的Typelist(参见http://www.research.ibm.com/designpatterns/pubs/ph-jun00.pdf)。问题是,每次编译器看到一个从Base
派生的新类时,它都需要向列表中添加一个新类型,但Typelists是不可变的(可以创建一个新的列表,并向其添加新类型,但据我所知,向列表中添加元素是不可能的。最后,我希望有这样的东西:
struct DerivedClassHolder {
typedef Loki::TL::MakeTypeList</*list all derived classes here*/>::Result DerivedTypes;
};
型
最终目标是能够迭代所有从Base
派生的类。
2条答案
按热度按时间ej83mcc01#
这可以使用伪类型Map来完成。下面是一些使用boost::mpl的示例代码。“Implem”的显式定义可以在每个对应的implem头部中使用宏来完成。
字符串
wvt8vs2t2#
您的类型列表只能手工创建。你提到的问题,不变性,是无法克服的。