gpt4 book ai didi

C++11 多播委托(delegate)实现

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

我想将委托(delegate)添加到我的游戏引擎中。我在 C# 中已经习惯了它们,现在我离不开它们。

我在这里和外部资源上看到了几个实现,但它们不是多播的。委托(delegate)一次只能存储一个监听器。有谁知道在 += 和 -= 支持下在内存/性能方面有什么好的实现吗?我已经尝试使用可变参数模板编写我的代码,但我还没有做到这一点。

编辑:这是我到现在为止所拥有的:

template<typename ... Args>
class Delegate
{
public:
Delegate() =default;
~Delegate() = default;

template<typename U>
Delegate& operator += (const U &func)
{
_listeners.push_back(std::function<void(Args...)>(func));
return *this;
}

template<typename Class, typename Method>
Delegate& operator += (const std::function<void(Args...)> func)
{
_listeners.push_back(func);
return *this;
}

void operator() (Args... params)
{
for (auto listener : _listeners)
{
listener(params...);
}
}

private:
std::list<std::function<void(Args...)>> _listeners;
};

它运行得非常好。在这里你可以看到如何使用它:

Delegate<std::string> del;
del += std::bind(&GameScene::print, this, std::placeholders::_1);
del += [](const std::string& str) { log(str.c_str()); };
del("text");

我知道我将几乎一直使用 std::bind 版本,因为它用于事件消息系统,实例将使用类方法订阅委托(delegate)(通过类方法,我不是指静态方法,而是类的一个方法)。无论如何改进 std::bind 部分?我认为当你必须添加一些带有占位符等的函数时,这有点丑陋和烦人......

干杯。

最佳答案

基本上,一个简单的 C++ 11 实现看起来像:

#include <vector>
#include <functional>

class Foo
{
public:

std::vector< std::function< void() > > onSomething;
};

int main( void )
{
Foo f;

f.onSomething.push_back( [&] { /* Do something... */ } );
f.onSomething.push_back( [&] { /* Do something else... */ } );

return 0;
}

请注意 std::function 的使用,它允许将 lambda 表达式存储在 vector 中。
然后,您将能够遍历 vector ,并执行每个 lambda。

然后,当然,运算符重载和线程安全(如果需要的话)......但这应该是微不足道的。

关于C++11 多播委托(delegate)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25857728/

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