在绑定函数/使用lambdas测试消息传递代码时遇到麻烦

Trouble binding functions/using lambdas to test message-passing code

本文关键字:代码 消息传递 遇到 麻烦 测试 lambdas 绑定 函数 使用      更新时间:2023-10-16

我确信这是一个简单的错误,但我不明白为什么编译器会这样对我大喊大叫。Signal有一个方法connect,用于指定信号发出时要调用的函数:Signal<Owner, TArgs...>::connect(const Handler& handler);

反过来,Handler只是函数的类型定义:

typedef function<void(const TArgs&...)> Handler;

所有的信号都是这样的:

ndn::util::signal::Signal<Rib, RibRouteRef> beforeRemoveRoute;

我需要做的是测试连接的函数实际接收到的是传递给发出信号的函数的内容。我试图用lambdas来捕获这个并在同一个函数中分析它,但无论我做什么,我都会得到编译器类型转换错误。我尝试使用的代码是:

  RibRouteRef routeInfo;
  std::function<void (RibRouteRef& rrrIn, RibRouteRef& rrrOut)> signalRec =
    [](RibRouteRef& rrrIn, RibRouteRef& rrrOut)
    { rrrOut = rrrIn; };
  rib.beforeRemoveRoute.connect(bind(&signalRec, _1, routeInfo));

除非我对bind()的理解非常不正确,否则应该是bind()接受lambda(封装在std::函数中,我认为我不需要),并接受它的两个参数,将一个绑定为routeInfo,另一个是新绑定函数的唯一参数。这个新的有界函数应该是:void (RibRouteRef&),对吧?但是,编译器错误是:

../tests/rib/rib.t.cpp:360:33: error: no viable conversion from 'typename _Bind_helper<__is_socketlike<function<void (RibRouteRef &, RibRouteRef &)> *>::value, function<void (RibRouteRef &, RibRouteRef &)> *, const _Placeholder<1> &, RibRouteRef &>::type' (aka '_Bind<std::function<void (nfd::rib::RibRouteRef &, nfd::rib::RibRouteRef &)> *(std::_Placeholder<1>, nfd::rib::RibRouteRef)>') 
to 'const Handler' (aka 'const function<void (const nfd::rib::RibRouteRef &)>')
  rib.beforeRemoveRoute.connect(bind(&signalRec, _1, routeInfo));

我只是不知道怎么了。有人能指出哪里不对吗?

根据您提供的代码,您的typedef不是一个单独的模板,所以我假设它使用的是TArgs…Signal

模板参数

如果这是正确的,那么所有者成为肋骨和目标…变成了基于Signal<>的单一参数RibRouteRef,这与你声明的需要两个RibRouteRef参数的lambda相矛盾。

我不知道它还会破坏什么,但是基于您提供的有限代码,您需要将Signal<>声明为如下内容:

ndn::util::signal::Signal<Rib, RibRouteRef, RibRouteRef> beforeRemoveRoute;

所以Handler类型将包含两个RibRouteRef参数而不是一个。

请注意,它在错误消息中声明了这一点(但以最不可读的方式),指定它不能从您提供的内容进行转换(在这些消息中,跳过typename展开并查看以'aka'开头的别名部分,以表示实际类型),

_Bind<std::function<void (nfd::rib::RibRouteRef &, nfd::rib::RibRouteRef &)> *(std::_Placeholder<1>, nfd::rib::RibRouteRef)>

转换为

的声明类型
const Handler
带有扩展别名类型 的

const function<void (const nfd::rib::RibRouteRef &)>

因此,它正确地告诉你,它不能将带有两个RibRouteRef参数的lambda转换为只有一个RibRouteRef参数的lambda