Re: [sigc] C++0x lambdas
- From: Murray Cumming <murrayc murrayc com>
- To: Chow Loong Jin <hyperair gmail com>
- Cc: libsigc-list gnome org
- Subject: Re: [sigc] C++0x lambdas
- Date: Thu, 05 Jan 2012 13:59:29 +0100
On Thu, 2012-01-05 at 16:41 +0800, Chow Loong Jin wrote:
> 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.
Is this something that we should add to libsigc++? If so, it would be
great to have a patch, with a test case too.
--
Murray Cumming
murrayc murrayc com
www.murrayc.com
www.openismus.com
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]