gpt4 book ai didi

c++ - 将基类模板的 `this` 类型转换为其派生类

转载 作者:太空狗 更新时间:2023-10-29 20:27:46 24 4
gpt4 key购买 nike

我的代码的简化版本如下所示:

template <class T>
struct Base
{
void SayHello( T* aDerived )
{
}

void SaySomething()
{
SayHello( this ); // This is where the error happens
}
};

struct Derived : public Base< Derived >
{
};

int main(int argc, const char * argv[])
{
Derived iDerived;
iDerived.SaySomething();
}

并且它不会在 SayHello( this ) 行上编译并出现以下错误消息:

Cannot initialize a parameter of type 'Derived *'
with an rvalue of type 'Base<Derived> *'

现在编译器提示这个是有道理的,虽然在我看来有点愚蠢,如果我删除这一行它不会提示:

iDerived.SaySomething();

无论如何,这个问题可以通过显式类型转换来解决,如下所示:

SayHello( (T*)this );

问题是我的实际代码以许多类型转换结束,在我看来,在 Base 中包含一些允许它自动类型转换为模板类的东西似乎是合理的( T).

我要找的是 operator= 吗?有人可以提供一个代码示例来说明这是如何完成的吗? This Question建议我可以做类似的事情:

转换总是在 thisT* 之间。

operator T*()
{
return (T*)this;
}

但错误依旧。

最佳答案

您可以添加一个辅助函数,它返回 this 向下转换为派生类型

template <class T>
struct Base
{
void SayHello( T* aDerived )
{
}

void SaySomething()
{
SayHello( derived_this() );
}

private:
T* derived_this()
{
return static_cast<T*>(this);
}

您可能还需要一个const 重载:

    const T* derived_this() const
{
return static_cast<const T*>(this);
}

可以添加隐式转换运算符,但我不推荐这样做:

    operator T*() { return static_cast<T*>(this); }

隐式转换削弱了类型系统并且可能成为错误的来源,我认为像 derived_this() 这样的显式函数更清晰、更安全。

关于c++ - 将基类模板的 `this` 类型转换为其派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213391/

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