【问题标题】:sigc++ with lambda giving error: void value not ignored as it ought to be带有 lambda 的 sigc++ 给出错误:不应忽略 void 值
【发布时间】:2014-10-20 17:16:45
【问题描述】:

我有一个连接到 c++11 lambda 的libsigc++ 信号。

sigc::signal<void, std::string> foo;

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

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

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

sigc::signal<int, std::string> foo;

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

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

这给出了一个错误:

不应该忽略的无效值

这种使用模式是否可以通过 lambdas 实现?

【问题讨论】:

    标签: c++ c++11 libsigc++


    【解决方案1】:

    请参阅此处提及的 SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE:https://developer.gnome.org/libsigc++/stable/group__slot.html#details

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

    namespace sigc {
      SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE
    }
    

    希望我们在未来的仅限 C++11 的 libsigc++ 版本中不再需要这样做。

    您可能也想使用 sigc::track_obj():https://developer.gnome.org/libsigc++/unstable/group__track__obj.html#details

    【讨论】:

    • 不错!期待尝试一下。谢谢。
    • 谢谢!这解决了我在尝试将信号连接到 C++ lambda 时的编译错误,而不必使用上面显示的时髦仿函数类。我在 Debian 8.2 上,所以有 libsigc 2.4 - 咬紧牙关并迁移到测试的另一个原因......
    【解决方案2】:

    龙进在this newsgroup posting提供解决方案。

    只需将 [此代码] 放在某处的标题中,并在您想使用时 #include 它 拉姆达斯。它还允许你抛出 std::function、boost::function 或任何 其他在 sigc::signals 也具有适当 operator() 的对象,因为 sigc::slot 现在很高兴地将它们包装起来。

    它仍然不适用于具有重载 operator() 的类,但你 对于这些情况,总是可以使用 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;
      };
    }
    

    如果有人能解释为什么会这样,那就太好了,因为我想在这里学习其中的机制。

    【讨论】:

    • “如果有人能解释一下为什么会这样,那就太好了” 这不应该成为您问题的一部分,而是作为如何解决问题的主要解决方案吗?
    • 第二个模板参数似乎与未从其仿函数基类继承的仿函数相对应。我的猜测是,他们从来没有费心实现这种情况,从那里,获取结果类型更直接(将 operator() 转换为 sigc 类型的成员函数仿函数并使用它来检索其结果类型)。
    • @πάνταῥεῖ,这与我问的问题不同。
    • 好吧,如果您最终要寻找有关找到的解决方案实际工作原理的答案,那只是您提出这个问题的内容和方式的详细信息。
    • 最新版本的 libsigc++(2.5.*,将稳定为 2.6.*)需要 C+11,不再需要 SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE 的时髦用法。
    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多