On 30/08/2011 21:16, Jakub Łukomski wrote: > Hello. Is there a way to use value returning C++0x lambdas with libsigc++? > > Functions not returning values work fine: > > sigc::slot <void> slot1 = [] () { }; > sigc::slot <void, int> slot2 = [] (int) { }; > > no compilation problems. However when a return value is added: > > sigc::slot <bool> slot3 = [] () -> bool { return true; }; > sigc::slot <bool, int> slot4 = [] (int) -> bool { return true; }; > > I end up getting two compilation errors: > /usr/include/sigc++-2.0/sigc++/functors/slot.h:103:36: error: void value not ignored as it ought to be > /usr/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h:251:21: error: return-statement with a value, in function returning 'void' > > Is that possible to achieve in some other way, or are lambdas with a return value not supported by libsigc++ yet? Alright, so I ran into this situation myself and spent the morning without internet connection figuring this out, and.... -----8<------ #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; }; } ----->8------ Just put that in a header somewhere and #include it when you want to use lambdas. It also allows you to throw std::function, boost::function, or any other object with an appropriate operator() at sigc::signals as well, since sigc::slot happily wraps them up now. It still doesn't work with classes that have an overloaded operator(), but you can always use a lambda for those cases. -- Kind regards, Loong Jin
Attachment:
signature.asc
Description: OpenPGP digital signature