gpt4 book ai didi

c++ - CRTP 在调用链中的使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:36 25 4
gpt4 key购买 nike

在我的小部件库中,我想实现某种调用链来初始化用户提供的 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);
}

当然,调用顺序可以颠倒。

参见 Is it possible to write a template to check for a function's existence?关于执行IF_EXISTS .另外,base_class<T>不是标准构造,并且this answer建议这不能自动完成。语义看起来像这样:

template<T>
struct base_class<T> {
typedef void bc;
};

template<>
struct base_class<UserView> {
typedef SpecializedView<UserView> bc;
};

也许您的框架允许以半自动方式执行此操作。

关于c++ - CRTP 在调用链中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com