CRTP 在调用链中的用法
Usage of CRTP in a call chain
在我的小部件库中,我想实现某种调用链来初始化一个用户提供的 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
当然,使用派生自的类型实例化变量应用程序很容易但是此代码隐藏在库中,不应更改。换句话说:库代码应仅获取用户派生类型作为参数。
您可以编写另一个函数,该函数在类和基类(如果存在)上调用initialize()
,并定义一个initialize()
方法:
template <class T>
void callInitialize(T* t) {
t->initialize();
IF_EXISTS(base_class<T>::bc::initialize)
callInitialize<base_class<T>::bc>(t);
}
当然,调用的顺序可以颠倒。
请参阅是否可以编写模板来检查函数是否存在? 关于IF_EXISTS
的实现 。此外,base_class<T>
不是标准结构,此答案表明这不能自动完成。 语义如下所示:
template<T>
struct base_class<T> {
typedef void bc;
};
template<>
struct base_class<UserView> {
typedef SpecializedView<UserView> bc;
};
也许您的框架允许半自动的方式来执行此操作。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- C++向量用法错误:没有匹配的成员函数来调用"push_back"
- 在调用运算符重载时识别调用上下文/用法C++
- CRTP 在调用链中的用法
- 函数调用中“&”的用法,令人困惑
- 使用C++检测习惯用法计算任意可调用对象的参数