CRTP (이상하게 반복되는 템플릿 패턴)를 사용하여 기본 클래스에 파생 클래스에 대한 지식을 제공 할 수 있습니다. 그것은 모든 (실시 예 참조)C++ 파생 클래스의 유형 목록
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
에서 파생 된 새 클래스를 볼 때마다 목록에 새 형식을 추가해야하지만 형식 목록은 변경되지 않습니다 (새 형식을 추가하여 새 목록을 만들 수는 있지만 .
struct DerivedClassHolder {
typedef Loki::TL::MakeTypeList</*list all derived classes here*/>::Result DerivedTypes;
};
궁극적 인 목표는 이상 Base
에서 파생 된 모든 클래스를 반복 할 수있다 :리스트에 요소를 추가하면 내가 아는 한 지금까지 결국 나는 이런 식으로 뭔가를하고 싶은으로 불가능하다
"모든 클래스에 대해 반복"* 의미 *는 무엇입니까? –
"베이스"에 대해 계속 이야기를 나누면 정신 착란이 될 수 있습니다. * 기본 클래스가 없습니다. 각각의 새 파생 클래스가 고유 한 개인 기본 유형을 가져 오는 템플릿 *이 있습니다. –
또한 글로벌 범위에서'addInstance'를 호출 할 때'm_derivedInstances'가 이미 초기화되었다고 보장하기를 원합니까? – Griwes