내 위젯 라이브러리에서 어떤 종류의 호출 체인을 초기화하려면 사용자가 제공 한 VIEW 클래스 (!)를 추가하는 다른 클래스에서 파생 될 수 있습니다 (예 : ) 이 :호출 체인에서 CRTP 사용
#include <iostream>
template<typename VIEW>
struct App
{
VIEW view;
void init() {view.initialize(); }
};
template<typename DERIVED>
struct SpecializedView
{
void initialize()
{
std::cout << "SpecializedView" << std::endl;
static_cast<DERIVED*>(this)->initialize();
}
};
struct UserView : SpecializedView<UserView>
{
void initialize() {std::cout << "UserView" << std::endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
// Cannot be altered to: App<SpecializedView<UserView> > app;
App<UserView> app;
app.init();
return 0;
}
는 (사용자 제공 VIEW 클래스 "SpecializedView"로부터 유도되는 경우) 콜 체인의 일종을 달성하는 것이 가능하다 같은 출력 될 것이다 : 물론
console output:
SpecializedView
UserView
그것 준비가 쉽다. 에서 파생 된 유형의 변수가없는 앱은 제외하지만이 코드는 라이브러리에 숨겨져있어 변경해서는 안됩니다. 즉, 라이브러리 코드는 매개 변수로 사용자 파생 유형 만 가져와야합니다. 당신은 너무 initialize()
방법이 존재하는 경우 클래스와 기본 클래스에 initialize()
를 호출하고 정의하는 또 다른 기능을 쓸 수
명백한 공개 초기화 방법은 매우 나쁩니다. – Puppy
@DeadMG : 위의 예제 코드는 최소한으로 제거되었습니다! 내 의도를 설명하는 데 필요한 것보다 더 많은 코드를 추가하고 싶지 않았습니다. – fhw72