2014-04-10 4 views
1

는 가변 인자 템플릿 매개 변수에서 선형 계층 구조를 생성 할 수 있습니까? 예를 들어C++ 가변 인자 템플릿 매개 변수

GenLinearHierarchy<A,B,C,D,...> linHierarchy; 

계층 구조를 생성 여기서 A -> B -> C -> D -> ... -> 빈 (여기서, (가) -> 심볼 상속 약자). 템플릿 매개 변수 (템플릿 템플릿 ... 매개 변수)과 같은 서명이

: 기본 계층 구조에서 위의 클래스이며, 플레이트 (예를 들어 '가장 파생'클래스

template <class Base, class Plate> class A; 

D < E < ...>를 < ...>>).

지금까지 내가 실패 있었어 - 내가 (내가 순환 문제가 계속 실행 않음) 원에 갈거야 여부를 궁금해하기 시작했다. - 혼란에 대해 죄송

여기에 '콘크리트 솔루션'(내가 너무 좋아 아니에요 일)입니다 : 그래서

// Linear Hierarchy 

#include <iostream> 

template <class Base, class Floor> 
class D : public Base 
{ 
public: 
}; 

template <class Base, class Floor> 
class C : public Base 
{ 
public: 
     void Fire() 
     { 
       static_cast<Floor*>(this)->Handle(); 
     } 
}; 

template <class Base, class Floor> 
class B : public Base 
{ 
public: 
     void Handle() 
     { 
       std::cout << "Handled" << std::endl; 
     } 
}; 

class _FINISH {}; 

class _START : public B<C<D<_FINISH, _START>, _START, _START> {}; 

int main() 
{ 
     typedef _START A; 
     A a; 
     a.Fire(); 

     return 0; 
} 

, 난 여전히 'GenLinearHierarchy'클래스를 찾고 있어요하는 수 이 같은 instatiation 위에서 뭔가를 생성하지만, : 그것은 아마 같은 뭔가

+0

저는 'A'가 상속받는 것을 약간 혼란 스럽습니다. 당신은 클래스를 변경할 수 없습니다'Base'와'Plate', 것만'A'를 구성하지만, 아마도 이것은 당신이 무엇을 의미하는지는 아니고, 단지 내 혼란을 예시한다. – Suedocode

+0

이것은 그림이 문자 그대로 천 단어를 말할 수있는 질문 중 하나입니다. – WhozCraig

+0

아니면 당신이 클래스의 집합 주어진 상속 계층 구조를 해결하려면 ... 이제 그 재미있을 것입니다. – Suedocode

답변

1

Plate이 가장 파생 된 유형이라고 생각할 수는 없습니다. 전체 유형이 자체 템플릿 매개 변수 중 하나가되어야 함을 의미합니다. 이것은 내가 들어 왔 가장 가까운 :

struct Empty {}; 

template <template <class> class Head, template <class> class... Tail> 
struct GenLinearHierarchy 
{ 
    typedef Head<typename GenLinearHierarchy<Tail...>::type> type; 
}; 

template <template <class> class Tail> 
struct GenLinearHierarchy<Tail> 
{ 
    typedef Tail<Empty> type; 
}; 

template <class Base> struct A : Base {}; 
template <class Base> struct B : Base {}; 
template <class Base> struct C : Base {}; 
template <class Base> struct D : Base {}; 

static_assert(std::is_same< typename GenLinearHierarchy<A,B,C,D>::type 
          , A<B<C<D<Empty>>>>       >::value 
      , ""); 

편집 나는 당신이달라고 무엇을 가지고 생각합니다. 행운을 빌어 읽어보십시오. 너 자신을 비난 할 뿐이야. :)

+0

그것은 대단하군요! 클래스의 상위 클래스가 하위 클래스의 함수를 호출하는 방법을 생각해 볼 수 있습니까? 이것이 각 요소가 가장 낮은 요소를 알고 싶어했기 때문에 계층을 통해 '이벤트'를 전달할 수있었습니다. 여전히 멋진 솔루션입니다! – user3513346

+0

@ user3513346 업데이트 됨. 당신이 바라는 것을 조심하십시오. (나는 5am에 이것을 썼다는 것을 꽤 믿을 수 없다.) – Oktalist

+0

하하는 완벽하게 보인다. 그것은 굉장한 Oktalist이다. 내가 나 자신을 생각 해낼 수 있었으면 좋겠어! 왜 당신이 그것을 두려워하는지 확실하지 않습니다 : P – user3513346

0

:)

GenLinearHierarchy<B,C,D> linHierarchy; 

감사합니다 ...

template<typename T, typename... Args> 
class GenLinearHierarchy : public T, public GenLinearHierarchy<Args...> {}; 

template<typename T> 
class GenLinearHierarchy<T> : public T {}; 
+0

이것은 내가하려는 일로 다가 가고 있습니다. 실제로 이것을 시도했습니다. 그러나 두 가지 - 선형 계층 구조는 아닙니다. G -> A, (G -> B, (G -> C .....)))의 단계적 계층 구조입니다. 두 번째로, 첫 번째 포인트와 관련하여 템플릿 매개 변수는 집합의 다음 템플릿 매개 변수에서 직접 상속하지 않습니다. 따라서 Base :: DoSomething과 같은 내용을 말할 수 없습니다. 나는 너희들에게 '구체적인'해결책을주기 위해 나의 질문을 수정할 것이다. 감사합니다 :) – user3513346

관련 문제