Re: sigc::mem_fun and Glib::RefPtr



All this seems incredibly complicated. Bug 495762 mentions an easier way. See especially comment 9.

https://bugzilla.gnome.org/show_bug.cgi?id=495762#c9

It's cryptic. I haven't tested it myself, but I suppose someone else has.

Glib::RefPtr<MyClass> c;
...
button.signal_clicked().connect(sigc::mem_fun(c.operator->(), &MyClass::on_button));

Kjell

2012-10-05 09:25, Horváth Imre skrev:
Thank you for your answer

I tried to replace std::shared_ptr with Glib::RefPtr, but it didn't
worked for me.

#include <memory>
#include <sigc++/sigc++.h>
#include <glibmm.h>

namespace sigc
{
template <class T>
struct dereference_trait<Glib::RefPtr<T> >
   { typedef T& type; };

template <class T>
struct dereference_trait<Glib::RefPtr<T>& >
   { typedef T& type; };

}

class MyClass : public Glib::Object
{
public:
	MyClass()
	: Glib::ObjectBase(typeid(MyClass))
	{
	}
     void on_button()
     {
     }
};

int main()
{
     Glib::RefPtr<MyClass> c(new MyClass);

     sigc::slot<void> f =
       sigc::bind(sigc::group(sigc::mem_fun(&MyClass::on_button),
                              *sigc::_1),
                  c);
     f();


     return 0;
}


g++ main.cpp `pkg-config --libs --cflags sigc++-2.0 glibmm-2.4` -std=c
++0x


In file included from /usr/include/sigc++-2.0/sigc
++/adaptors/lambda/lambda.h:25,
                  from /usr/include/sigc++-2.0/sigc
++/adaptors/adaptors.h:30,
                  from /usr/include/sigc++-2.0/sigc++/sigc++.h:26,
                  from main.cpp:2:
/usr/include/sigc++-2.0/sigc++/adaptors/lambda/operator.h: In static
member function ‘static typename
sigc::lambda_action_unary_deduce_result_type<sigc::unary_other<sigc::dereference>, T_test>::type sigc::lambda_action_unary<sigc::unary_other<sigc::dereference> >::do_action(T_arg) [with T_arg = Glib::RefPtr<MyClass>&]’:
/usr/include/sigc++-2.0/sigc++/adaptors/lambda/operator.h:788:
instantiated from ‘typename sigc::lambda_operator_unary<T_action,
T_type>::deduce_result_type<T_arg1, void, void, void, void, void,
void>::type sigc::lambda_operator_unary<T_action,
T_type>::operator()(T_arg1) const [with T_arg1 = Glib::RefPtr<MyClass>&,
T_action = sigc::unary_other<sigc::dereference>, T_type =
sigc::internal::lambda_select1]’
/usr/include/sigc++-2.0/sigc++/adaptors/lambda/base.h:70:   instantiated
from ‘typename sigc::internal::lambda_core<T_type,
true>::deduce_result_type<T_arg1, void, void, void, void, void,
void>::type sigc::internal::lambda_core<T_type,
true>::operator()(T_arg1) const [with T_arg1 = Glib::RefPtr<MyClass>&,
T_type =
sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>,
sigc::internal::lambda_select1>]’
/usr/include/sigc++-2.0/sigc++/adaptors/lambda/group.h:93:
instantiated from ‘typename sigc::lambda_group1<T_functor,
T_type1>::deduce_result_type<T_arg1, void, void, void, void, void,
void>::type sigc::lambda_group1<T_functor, T_type1>::operator()(T_arg1)
const [with T_arg1 = Glib::RefPtr<MyClass>&, T_functor =
sigc::mem_functor0<void, MyClass>, T_type1 =
sigc::lambda<sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>, sigc::internal::lambda_select1> >]’
/usr/include/sigc++-2.0/sigc++/adaptors/lambda/base.h:70:   instantiated
from ‘typename sigc::internal::lambda_core<T_type,
true>::deduce_result_type<T_arg1, void, void, void, void, void,
void>::type sigc::internal::lambda_core<T_type,
true>::operator()(T_arg1) const [with T_arg1 = Glib::RefPtr<MyClass>&,
T_type = sigc::lambda_group1<sigc::mem_functor0<void, MyClass>,
sigc::lambda<sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>, sigc::internal::lambda_select1> > >]’
/usr/include/sigc++-2.0/sigc++/adaptors/bind.h:1110:   instantiated from
‘typename sigc::adapts<T_functor>::adaptor_type::result_type
sigc::bind_functor<-0x00000000000000001, T_functor, T_type1, sigc::nil,
sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>::operator()()
[with T_functor =
sigc::lambda<sigc::lambda_group1<sigc::mem_functor0<void, MyClass>,
sigc::lambda<sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>, sigc::internal::lambda_select1> > > >, T_type1 = Glib::RefPtr<MyClass>]’
/usr/include/sigc++-2.0/sigc++/functors/slot.h:103:   instantiated from
‘static T_return sigc::internal::slot_call0<T_functor,
T_return>::call_it(sigc::internal::slot_rep*) [with T_functor =
sigc::bind_functor<-0x00000000000000001,
sigc::lambda<sigc::lambda_group1<sigc::mem_functor0<void, MyClass>,
sigc::lambda<sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>, sigc::internal::lambda_select1> > > >, Glib::RefPtr<MyClass>, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>, T_return = void]’
/usr/include/sigc++-2.0/sigc++/functors/slot.h:110:   instantiated from
‘static void* (* sigc::internal::slot_call0<T_functor,
T_return>::address())(void*) [with T_functor =
sigc::bind_functor<-0x00000000000000001,
sigc::lambda<sigc::lambda_group1<sigc::mem_functor0<void, MyClass>,
sigc::lambda<sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>, sigc::internal::lambda_select1> > > >, Glib::RefPtr<MyClass>, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>, T_return = void]’
/usr/include/sigc++-2.0/sigc++/functors/slot.h:454:   instantiated from
‘sigc::slot0<T_return>::slot0(const T_functor&) [with T_functor =
sigc::bind_functor<-0x00000000000000001,
sigc::lambda<sigc::lambda_group1<sigc::mem_functor0<void, MyClass>,
sigc::lambda<sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>, sigc::internal::lambda_select1> > > >, Glib::RefPtr<MyClass>, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>, T_return = void]’
/usr/include/sigc++-2.0/sigc++/functors/slot.h:1130:   instantiated from
‘sigc::slot<T_return, sigc::nil, sigc::nil, sigc::nil, sigc::nil,
sigc::nil, sigc::nil, sigc::nil>::slot(const T_functor&) [with T_functor
= sigc::bind_functor<-0x00000000000000001,
sigc::lambda<sigc::lambda_group1<sigc::mem_functor0<void, MyClass>,
sigc::lambda<sigc::lambda_operator_unary<sigc::unary_other<sigc::dereference>, sigc::internal::lambda_select1> > > >, Glib::RefPtr<MyClass>, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>, T_return = void]’
main.cpp:42:   instantiated from here
/usr/include/sigc++-2.0/sigc++/adaptors/lambda/operator.h:489: error: no
match for ‘operator*’ in ‘*_Aa’



Regards,
Imre

2012. 10. 4, csütörtök keltezéssel 22.07-kor klaus triendl ezt írta:
Am Thu, 04 Oct 2012 18:31:17 +0200
schrieb Horváth Imre <blemidon gmail com>:

Hi!

IS there a solution to use Glib::RefPtr with sigc::mem_fun?
Example:

Glib::RefPtr<MyClass> c;
...
button.signal_clicked().connect(sigc::mem_fun(c,
&MyClass::on_button));
yes, there is, by using sigc lambdas. a little complicated but it works.

short example program (replace std::shared_ptr by Glib::RefPtr):

<code>
#include <memory>
#include <sigc++/sigc++.h>


namespace sigc
{

// the partially specialized struct dereference_trait is essential,
// otherwise sigc can't deduce the return type from expression *sigc::_1

template <class T>
struct dereference_trait<std::shared_ptr<T> >
   { typedef T type; };

template <class T>
struct dereference_trait<std::shared_ptr<T>& >
   { typedef T type; };

}


struct MyClass
{
     void on_button()
     {
     }
};


int main()
{
     std::shared_ptr<MyClass> c(new MyClass);

     sigc::slot<void> f =
       sigc::bind(sigc::group(sigc::mem_fun(&MyClass::on_button),
                              *sigc::_1),
                  c);
     f();


     return 0;
}
</code>

if you have variadic templates available you could pack the
sigc::bind(sigc::group()) part into a factory function, in order to
make the code more readable.



greetings,
klaus




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]