gpt4 book ai didi

c++ - 在 C++ 中获取指向调用对象的指针

转载 作者:行者123 更新时间:2023-11-28 02:47:28 25 4
gpt4 key购买 nike

我的问题相当简单:如何在不传递 this 的情况下获取指向调用函数的对象的指针?

然而,我问的原因稍微复杂一些。

我之所以会问这个问题,是因为我正在编写一个类(名为 SubordnateRegistry),其中包含函数委托(delegate)的异构列表(列表)——具有不同签名的可调用对象。

无论哪个类希望调用委托(delegate),都必须自行注册,当然,要注册它们希望接收的数据类型,以及指向对象的指针或已构造的委托(delegate)。来自 Bar 类内部的调用可能如下所示:

ARegistry.Subscribe <Foo> (& Bar:: BarFunction, this);

或者像这样:

using namespace std:: placeholders;
auto Func = std:: bind (& Bar:: BarFunction, this, _1);
ARegistry.Subscribe <Foo> (Func);

因为 std::function 更通用(您可以绑定(bind)任何可调用对象,包括 lambda),我更愿意使用它而不是原始指针。

我的问题在于我必须始终指定 this。如果我传递了一个无效的指针,或者最终注册了一个完全不相关的对象,那么我将在未来某个不确定的点调用 UB,而不知道它来自哪里或错误的根源在哪里。可恶的!

现在,如果您想知道如果调用者不是一个对象(一个自由函数)会发生什么,那么该元素将永远保持注册状态,因为我永远不会自动删除(注销)可调用对象,因为它永远不会析构.

任何想法,或者这是否像我被引导相信的那样不可能?预处理器魔术是一种选择吗?有没有更好的办法?

当然,欢迎任何问题。谢谢你的时间 :)。

最佳答案

例如,您可以使用#define 自动包含this

#define REG_SUBSCRIBE(t,f) ARegistry.Subscribe <t> (f, this)

当然这会很快变丑,所以我不知道我是否会推荐它。

如果您担心跟踪和释放它们,那么我建议返回一个带有取消订阅该事物的析构函数的对象。或者(或另外)提供方法调用来执行此操作。

关于c++ - 在 C++ 中获取指向调用对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964053/

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