Thank you, it works! Regards, Imre Horvath
2012. 10. 5, péntek keltezéssel 10.38-kor Kjell Ahlstedt ezt írta: > 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 <[email protected]>: > >> > >>> 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 > > > _______________________________________________ gtkmm-list mailing list [email protected] https://mail.gnome.org/mailman/listinfo/gtkmm-list
