gpt4 book ai didi

c++ - 重载智能指针指向的成员函数

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

我有一个结构

struct A {
void f() {}
void g() {}
};

和一个自定义智能指针,其中包含一个指向 A 的指针:

struct P {
...
A* a;
};

我想以这样一种方式编写 P,即在我编写时 A::f() 不会被调用

P p;
p->f();

应该调用重载函数。然而,当我写的时候 A::g() 应该仍然被调用

p->g();

我希望我可以通过重载 P::operator-> 来实现这一点,但我没有成功。有什么建议吗?

编辑:这是我尝试过的:

#include <iostream>

struct A {
void f() {}
void g() {}
};

struct P {
struct Wrapper
{
Wrapper(A* aa) : _a(aa) {}
void f()
{
std::cout << "Overloaded\n";
}
A* operator->()
{
return _a;
}
private:
A* _a;
};

Wrapper operator->()
{
return Wrapper(a);
}
private:
A* a;
};

main()
{
P p;
p->f();
}

但这根本不打印任何内容,因为当我调用 p->f() 时,调用的是 Wrapper::operator-> 而不是 Wrapper::f()。

最佳答案

您的 P::operator-> 通常会返回一个 A* 原始指针。要得到你想要的,你需要一个可以返回的代理对象,它实现了那些功能。

class A_proxy
{
A* p;
public:
A_proxy(A* ptr) : p(ptr) {}
void f() { /* do whatever crazy stuff you want here */ }
void g() { p->g(); }
};

A_proxy* P::operator->()
{
return &m_proxy;
}

这是基于评论中提出的异议的替代方法。由于指针的类型双关,这个可能会遇到未定义的行为。

struct A_proxy : public A
{
void f() { /* as before, crazy stuff here */ }
};

A_proxy* P::operator->()
{
return static_cast<A_proxy*>(a);
}

关于c++ - 重载智能指针指向的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40681720/

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