2017-04-05 2 views
0

이러한 동작을 구현할 수 있습니까? 그것은 상속을 사용할 필요가 없다. 나는 (C++ 템플릿으로) 일반적인 인자를 전달하는 템플릿 메소드 디자인 패턴을 구현하기를 원한다.나중에 구현 된 함수를 사용할 클래스 메서드 템플릿을 만듭니다.

class A { 
public: 
    template<typename ...tArgs> 
    void call(tArgs ...vArgs) { 
     for (int i = 0; i < 5; ++i) 
      impl(vArgs...); 
    } 
}; 

class B : public A { 
public: 
    void impl() {} 
    void impl(int) {} 
}; 

int main() { 
    B b; 
    b.call(); // ok 
    b.call(1); // ok 
    b.call(""); // compile error, no method to call inside 'call' 
    return 0; 
} 
+1

. 귀하의 예제에서 컴파일 시간에'const char *'에 대한 과부하가 없으므로 컴파일 오류가 발생합니다. –

+0

[그 코드의 유일한 오류는 아닙니다.] (http://coliru.stacked-crooked.com/a/6dc7e20197d5f898)'impl'이 해결할 수 없기 때문에'call'을 호출 한 사람은 없습니다. – WhozCraig

+0

이 예제는 마지막 호출이없는 이벤트는 작동하지 않습니다. 나는 단지 원하는 행동을 묘사했다. – omicronns

답변

3

이것은 단지 몇 가지 작은 변화가 요구의 CRTP pattern의 거의 전형적인 예이다 : 당신이 무엇을 달성하고자하는 매우 명확하지

// A is now a template taking its subclass as a parameter 
template <class Subclass> 
class A { 
public: 
    template<typename ...tArgs> 
    void call(tArgs ...vArgs) { 
     for (int i = 0; i < 5; ++i) 
      // need to static cast to Subclass to expose impl method 
      static_cast<Subclass*>(this)->impl(vArgs...); 
    } 
}; 

// pass B into A template (the "curiously recurring" part) 
class B : public A<B> { 
public: 
    void impl() {} 
    void impl(int) {} 
}; 

int main() { 
    B b; 
    b.call(); // ok 
    b.call(1); // ok 
    // b.call(""); // will cause compile error, no method to call inside 'call' 
    return 0; 
}