gpt4 book ai didi

c++ - 使用 std::tr1::function(或 boost::function)创建多播事件

转载 作者:太空狗 更新时间:2023-10-29 20:01:16 26 4
gpt4 key购买 nike

我正在尝试使用 TR1 中的功能创建类似 C# 的多播委托(delegate)和事件。或 Boost,因为 boost::function(大部分)与 std::tr1::function 相同。作为概念证明,我尝试了这个:

template<typename T1>
class Event
{
private:
typedef std::tr1::function<void (T1)> action;
std::list<action> callbacks;

public:

inline void operator += (action func)
{
callbacks.push_back(func);
}

inline void operator -= (action func)
{
callbacks.remove(func);
}

void operator ()(T1 arg1)
{
for(std::list<action>::iterator iter = callbacks.begin();
iter != callbacks.end(); iter++)
{
(*iter)(arg1);
}
}
};

哪个有效,有点。 callbacks.remove(func) 行没有。当我编译它时,出现以下错误:

error C2451: conditional expression of type 'void' is illegal

这是由 list header 的第 1194 行引起的,它位于 remove 函数中。这是什么原因造成的?

最佳答案

如果您正在寻找 C++ 中的多播委托(delegate),最好的选择是 Boost.Signals2 .您也可以使用 Boost.Bind使使用成员函数进行回调成为可能。

你可以看看我的例子here用于简单使用 Boost.Signals 和 Boost.Bind。

Boost.Signal 提供生命周期管理设施以确保事件不会发布给不再存在的订阅者。

关于c++ - 使用 std::tr1::function(或 boost::function)创建多播事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2226691/

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