2

libsigc++C ++ 11ラムダに接続されている信号があります。

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;

これによりエラーが発生します。

void 値が無視されないはずです

この使用パターンはラムダで可能ですか?

4

2 に答える 2

2

ここで 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
}

libsigc++ の将来の C++11 専用バージョンでは、これが不要になることを願っています。

おそらく sigc::track_obj() も使用したいと思うでしょう: https://developer.gnome.org/libsigc++/unstable/group__track__obj.html#details

于 2015-07-09T20:34:10.037 に答える
1

Loong Jin は、このニュースグループへの投稿で解決策を提供しています。

[このコード] をヘッダーのどこかに配置し、ラムダを使用する場合は #include するだけです。また、std::function、boost::function、または適切な operator() を使用して sigc::signals でその他のオブジェクトをスローすることもできます。

オーバーロードされた operator() を持つクラスではまだ機能しませんが、そのような場合にはいつでもラムダを使用できます。

コード:

#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;
  };
}

ここで仕組みを学びたいので、誰かがこれがなぜ機能するのかを説明できれば素晴らしいと思います.

于 2014-10-20T17:16:45.180 に答える