gpt4 book ai didi

c++ - 如何在类层次结构中处理 CRTP?

转载 作者:行者123 更新时间:2023-11-28 07:52:34 28 4
gpt4 key购买 nike

在我的一个项目中,我使用与此处的答案 1 相同的 CRTP 方法(源自 enable_crtp):How do I pass template parameters to a CRTP?

但是我也需要从派生类派生。有什么方法可以使它工作,而不是回退到 static_cast this 指针,而是使用 Enable CRTP 基类中的 self() 方法?

#include "EnableCRTP.h"

template<typename DERIVED>
class BASE : public EnableCRTP<DERIVED>
{
friend DERIVED;
public:
void startChain()
{
self()->chain();
}
};

template<typename DERIVED>
class Derived1 : public BASE<Derived1<DERIVED> >
{
public:
void chain()
{
std::cout << "Derived1" << std::endl;

//self()->chain2(); <- compile Error
static_cast<DERIVED*>(this)->chain2(); // <-Works
}
};

class Derived2 : public Derived1<Derived2>
{
public:
void chain2()
{
std::cout << "Derived2" << std::endl;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
Derived2 der;
der.startChain();
return 0;
}

最佳答案

您可以将最派生类作为模板参数提供给 CRTP 基类,这样它就可以访问其所有成员。而不是

template<typename DERIVED>
class Derived1 : public BASE<Derived1<DERIVED> >

使用:

template<typename DERIVED>
class Derived1 : public BASE<DERIVED>

您的代码还存在其他问题。例如,你不能像你那样直接调用 self() 因为编译器不知道 self 是基类的成员(它依赖于模板参数)。相反,调用 this->self()。参见 this FAQ entry .

关于c++ - 如何在类层次结构中处理 CRTP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13453622/

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