gpt4 book ai didi

C++11 : Compare lambda expression

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

假设有以下类:

#include <functional>
#include <vector>

template<typename T1> class Signaler
{
public:
typedef std::function<void (T1)> Func;

public:
Signaler()
{
}

void Call(T1 arg)
{
for(Int32 i = (Int32)_handlers.size() - 1; i > -1; i--)
{
Func handler = _handlers[i];
handler(arg);
}
}

Signaler& operator+=(Func f)
{
_handlers.push_back( f );
return *this;
}

Signaler& operator-=(Func f)
{
for(auto i = _handlers.begin(); i != _handlers.end(); i++)
{
if ( (*i).template target<void (T1)>() == f.template target<void (T1)>() )
{
_handlers.erase( i );
break;
}
}

return *this;
}

private:
std::vector<Func> _handlers;
};

我按以下方式使用它:

Signaler Global::Signal_SelectionChanged;

class C1
{
public:
void Register()
{
Global::Signal_SelectionChanged += [&](SelectionChangedEventArgs* e) { this->selectionChangedEvent_cb(e); };
}

void Unregister()
{
Global::Signal_SelectionChanged -= [&](SelectionChangedEventArgs* e) { this->selectionChangedEvent_cb(e); };
}

void selectionChangedEvent_cb(SelectionChangedEventArgs* e) {}
};

class C2
{
public:
void Register()
{
Global::Signal_SelectionChanged += [&](SelectionChangedEventArgs* e) { this->selectionChangedEvent_cb(e); };
}

void Unregister()
{
Global::Signal_SelectionChanged -= [&](SelectionChangedEventArgs* e) { this->selectionChangedEvent_cb(e); };
}

void selectionChangedEvent_cb(SelectionChangedEventArgs* e) {}
};

现在,我遇到的问题是当我从类 C2 调用“注销”时,它删除了错误版本的“lambda”表达式,因为“lambda”看起来很相似。

我该如何解决这个问题?

有什么想法吗?

谢谢

最佳答案

问题是您使用的 std::function::target 类型不是存储在 std::function 中的对象类型,所以它返回一个空指针。也就是说,您需要知道存储在 std::function 中的对象的实际类型才能调用 target

即使您使用用于添加回调的 lambda 闭包类型调用 target,这也行不通,原因有二:首先,lambda 闭包类型是唯一的 (5.1.2p3),因此+=-= lambda 具有不同的类型,即使它们在语法上相同;其次,lambda 表达式的闭包类型未定义为具有 operator==(5.1.2p3-6、19-20),因此您的代码甚至无法编译。

从 lambda 转换为 std::bind 没有帮助,因为绑定(bind)类型也没有定义为具有 operator==

相反,请考虑使用 id 来注册/取消注册回调。您也可以使用自己定义 operator== 的仿函数,但这需要大量工作。

关于C++11 : Compare lambda expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21328229/

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