我有一个libsigc++信号,它连接到一个c++11灯。
sigc::signal<void, std::string> foo;
foo.connect([](string s) { cout << s << endl; });
foo.emit(string("Hello"));我想将信号的返回类型从void更改为非无效
sigc::signal<int, std::string> foo;
foo.connect([](string s) { return s.size(); });
cout << foo.emit(string("Hello")) << endl;这就产生了一个错误:
虚值不应被忽视
这种使用模式可以用于lambdas吗?
发布于 2015-07-09 20:34:10
参见此处提到的SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE:slot.html#details
您只需要将它放在源文件的顶部:
namespace sigc {
SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
}希望我们在将来只使用C++11版本的libsigc++中可以避免这种情况。
您可能也想使用sigc::track_obj():obj.html#details
发布于 2014-10-20 17:16:45
Loong在此新闻组公告中提供了一个解决方案。
只需将此代码放在某个地方的标题中,并在要使用lambdas时将其包括在内。它还允许您抛出std::function、boost::function或任何其他带有适当运算符()的σ::signals,因为σ::S槽现在很高兴地将它们包装起来。 它仍然不适用于具有重载运算符()的类,但对于这些情况,始终可以使用lambda。
守则:
#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;
};
}如果有人能解释一下为什么会起作用,那就太好了,因为我想在这里学习机械原理。
https://stackoverflow.com/questions/26471257
复制相似问题