2011-03-24 3 views
2

이 의사를 고려 확장하는 클래스에서 const 정적 초기화 Dude 클래스 나는 왜 Blah<int>을 확장하는 여러 클래스를 가질 수 있었는지 이해합니다.템플릿

나는 그것이 작동합니다 template<typename T> int Blah<T>::ID = 10' in the Blah<T> IMPL를 넣으면 이해 ...하지만 그건 내가 파생 클래스 ID를 정의하려면 ... 원하는 아니지만 ...

내가 밀어해야합니까 ID 및 getID() 파생 클래스로? 궁극적으로 일부 RTTI에 관심이있어서 Foo을 적절히 처리 할 수 ​​있습니다. 누구든지 더 좋은 패턴을 가지고 있다면, 나는 모두 귀입니다. 의견의 일부에 대응

편집 ... 내가 유일하게 내가 특정 클래스 ID에 일부 Foo 객체의 런타임 ID를 비교할 수있는 ID를 통해 Foo에서 파생 클래스를 확인하고 싶습니다.

감사합니다.

+0

문제를 올바르게 이해하고 있는지 잘 모르겠습니다. CRTP 확인해 봤어? 여기서 유용 할 수 있습니다. http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – Asha

+0

@Asha : 저는 CRTP에 익숙하지 않습니다 ...하지만 Dude를 템플릿 패러미터로 사용하고 싶다고 생각하지 않습니다. –

+1

당신은 [대답 할 수 없게하는] (http://www.catb.org/~esr/faqs/smart-questions.html)에 대해 질문하고 있습니다 (http : // jalf.dk/blog/2010/09/yes-youre-going-to-have-to-tell-me-what-your-question-is-before-i-can-answer-it/). 무엇을 성취하려고합니까? – GManNickG

답변

0

난 당신이 단순히이 작업을 수행 할 수 있다고 생각 :

class Dude : public Blah<int> { 
} 
static const int Dude_ID; //declaration! 

int receive(const Foo& foo) { 
    if(foo.getID() == Dude::Dude_ID) { 
     cout << "Received a Dude" << endl; 
    } 
} 
static const int Dude::Dude_ID = 10; // definition! 

마찬가지로, 각 파생 클래스에 대한 ID를 정의합니다.

template<typename T, int ID=1> 
class Blah : public Foo { 
public: 
    int getID() const { return ID; } 
} 

template<int ID=10> 
class Dude : public Blah<int> { 
public: 
    int getID() const { return ID; } 
} 
+0

나는 내 질문에 답을 언급한다. 나는 블러 (Blah)를 확장하는 수십개의 클래스를 가지고 있기 때문에 모든 보일러 플레이트 코딩을 피할 수 있는지 궁금하다. –

+0

@T Reddy : 편집을 참조하십시오. – Nawaz

+0

몇 가지 질문을 봅니다 ... Dude를 템플릿 클래스로 만들겠습니까 ... Dude : public Blah ? –

1

정적 INT의 ID를 확인, 각 클래스에 대한 ID를 가지고


또 다른 방법은 이것이다 개인, 공용 인터페이스에서 GetID를 제공하면 SetID를 보호 된 인터페이스로 만들 수 있습니다. 그러나 파생 된 모든 클래스가 원하는 ID를 공유하지 않기 때문에 이는 좋은 해결책이 아닙니다.

기본 클래스의 템플릿 매개 변수로 ID를 사용하는 것이 더 좋습니다. 클래스 {Derived : public Base <>}가 작동합니다.

또는 가상 const int GetID() = 0을 기본 클래스에 추가하십시오.