私のウィジェットライブラリでは、ユーザー提供のVIEWクラスを初期化するために、ある種の呼び出しチェーンを実装したいと思います。このクラスは、次のような追加機能を追加する別のクラスから派生する可能性があります。
#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
もちろん、から派生したタイプで変数アプリをインスタンス化するのは簡単ですが、このコードはライブラリに隠されているため、変更できないようにする必要があります。言い換えると、ライブラリコードは、ユーザー派生型のみをパラメーターとして取得する必要があります。