gpt4 book ai didi

c++ - 如何使用仿函数和 operator() 实现委托(delegate)

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:54 24 4
gpt4 key购买 nike

我一直在尝试遵循其中的一些建议:

https://softwareengineering.stackexchange.com/a/213635/46534

https://en.wikipedia.org/wiki/Function_object

但努力让它编译。<​​/p>

我有一个委托(delegate)定义:

struct SomeDelegate {
void operator()(SomeType *data) {
//do some stuff with data
}
};

然后是接受函数指针的成员函数:

void DoSomethingThatCallsback(void(*callback)(SomeType *) ) {
callback(ptrToSomeType);
}

然后当我尝试按如下方式使用此成员函数时:

foo.DoSomethingThatCallsback(SomeDelegate());

编译错误:

cannot convert argument 1 from 'SomeDelegate' to 'void (__cdecl *)(Core::SomeType *)'

所有我一直在阅读的示例表明这是可能的。

我试过使用这样的模板:

template <typename Callback>
void DoSomethingThatCallsback(Callback callback)

但是我得到了类似的错误。

我最终正在寻找一种更面向对象的方法来求助于函数指针或迁移到 C++11。此外,无法使用 STL。

更新了更多上下文

struct MapOpenedDelegate {
public:

void operator()(Map *openedMap) {

}
};

class MapReader {
public:

template <typename Callback>
void RegisterMapOpenedCallback(Callback &callback) {
_callbacks.Add(callback);
}

private:
Rise::List<void(*)(Map *)> _callbacks;
};
...
mapReader.RegisterMapOpenedCallback(MapOpenedDelegate());

最佳答案

第一种方法不起作用,因为您告诉您的函数接受一个函数指针,同时向它传递一个 SomeDelegate 实例。

模板方法确实可行,具体取决于模板的主体。

可用的模板示例:

template <typename Callback>
void DoSomethingThatCallsback(Callback& callback) {
callback(ptrToSomeType);
}

请注意,鉴于 ptrToSomeType 的类型为 SomeType*,此方法有效。 Callback 类型等于您在问题中定义的 SomeDelegate 类型,或者提供 operator() 的任何其他类型SomeType* 作为唯一的参数。

更新

鉴于您现在提供给我的内容,我认为没有真正的理由在此处使用模板。

首先,在我之前的回答中,我并不知道这些回调实例要存储在列表中。这彻底改变了局面。

在下面的问题解决方案中,我假设 RegisterMapOpenedCallback 的调用者拥有回调实例的所有权。调用者通过引用传递它们,MapReader 仅存储指向它们的指针。

struct MapOpenedDelegate {
public:

void operator()(Map *openedMap) {

}
};

class MapReader {
public:

void RegisterMapOpenedCallback(MapOpenedDelegate& callback) {
_callbacks.Add(&callback);
}

private:
Rise::List<MapOpenedDelegate*> _callbacks;
};

为了提供一个完全清晰的解决方案,我仍然缺少上下文。除了存储一些回调实例之外,我不太确定你想要实现什么。不过,我确实希望以上内容能以某种方式对您有所帮助。

关于c++ - 如何使用仿函数和 operator() 实现委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45164272/

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