首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有lambda错误的sigc++:不应该忽略的空值

具有lambda错误的sigc++:不应该忽略的空值
EN

Stack Overflow用户
提问于 2014-10-20 17:16:45
回答 2查看 909关注 0票数 2

我有一个libsigc++信号,它连接到一个c++11灯。

代码语言:javascript
复制
sigc::signal<void, std::string> foo;

foo.connect([](string s) { cout << s << endl; });

foo.emit(string("Hello"));

我想将信号的返回类型从void更改为非无效

代码语言:javascript
复制
sigc::signal<int, std::string> foo;

foo.connect([](string s) { return s.size(); });

cout << foo.emit(string("Hello")) << endl;

这就产生了一个错误:

虚值不应被忽视

这种使用模式可以用于lambdas吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-09 20:34:10

参见此处提到的SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE:slot.html#details

您只需要将它放在源文件的顶部:

代码语言:javascript
复制
namespace sigc {
  SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
}

希望我们在将来只使用C++11版本的libsigc++中可以避免这种情况。

您可能也想使用sigc::track_obj():obj.html#details

票数 2
EN

Stack Overflow用户

发布于 2014-10-20 17:16:45

Loong在此新闻组公告中提供了一个解决方案。

只需将此代码放在某个地方的标题中,并在要使用lambdas时将其包括在内。它还允许您抛出std::function、boost::function或任何其他带有适当运算符()的σ::signals,因为σ::S槽现在很高兴地将它们包装起来。 它仍然不适用于具有重载运算符()的类,但对于这些情况,始终可以使用lambda。

守则:

代码语言:javascript
复制
#include <type_traits>
#include <sigc++/sigc++.h>

namespace sigc
{
  template <typename Functor>
  struct functor_trait<Functor, false>
  {
    typedef decltype (::sigc::mem_fun(std::declval<Functor&>(),
                                      &Functor::operator())) _intermediate;
    typedef typename _intermediate::result_type result_type;
    typedef Functor functor_type;
  };
}

如果有人能解释一下为什么会起作用,那就太好了,因为我想在这里学习机械原理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26471257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档