Re: sigc::mem_fun and Glib::RefPtr



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]