c – 调用函数并传递存储在元组中的参数?
发布时间:2020-12-16 07:28:56 所属栏目:百科 来源:网络整理
导读:我想要一个类Foo来存储一个函数指针,它在构造时得到,并在某个时候调用这个函数.我看了这两个问题寻求帮助: Pass tuple’s content as variadic function arguments How do I expand a tuple into variadic template function’s arguments? 并且,根据答案,
我想要一个类Foo来存储一个函数指针,它在构造时得到,并在某个时候调用这个函数.我看了这两个问题寻求帮助:
> Pass tuple’s content as variadic function arguments 并且,根据答案,提出了这个代码: #include <functional> template < int N,typename... ARGS > struct apply_func { static void applyTuple( std::function<void(ARGS...)>& f,const std::tuple<ARGS...>& t,ARGS... args ) { apply_func<N-1>::applyTuple( f,t,std::get<N-1>( t ),args... ); } }; template <typename... ARGS> struct apply_func<0,ARGS...> { static void applyTuple( std::function<void(ARGS...)>& f,const std::tuple<ARGS...>& /* t */,ARGS... args ) { f( args... ); } }; template < typename... ARGS > void applyTuple( std::function<void(ARGS...)>& f,std::tuple<ARGS...> const& t ) { apply_func<sizeof...(ARGS),ARGS...>::applyTuple( f,t ); } template<typename... ARGS> class Foo { std::function<void(ARGS...)> m_f; std::tuple<ARGS...> *argument_pack; public: Foo(std::function<void(ARGS...)> f):m_f(f){} void operator()(ARGS... args); void run(); }; template<typename... ARGS> void Foo<ARGS...>::operator()(ARGS... args) { m_f(args...); // this works } template<typename... ARGS> void Foo<ARGS...>::run() { applyTuple<ARGS...>(m_f,*argument_pack); // this doesn't compile } void bar(int i,double d){} int main(void) { Foo<int,double> foo(bar); foo(1,1.0); // this works foo.run(); // this doesn't compile } 如果使用’g -std = c 0x’进行编译,则最后一行的下一行将显示以下错误: test.cc: In function ‘void applyTuple(std::function<void(ARGS ...)>&,const std::tuple<_Elements ...>&) [with ARGS = {int,double}]’: test.cc:52:9: instantiated from ‘void Foo<ARGS>::run() [with ARGS = {int,double}]’ test.cc:61:17: instantiated from here test.cc:27:8: error: no matching function for call to ‘apply_func<2,int,double>::applyTuple(std::function<void(int,double)>&,const std::tuple<int,double>&)’ test.cc:27:8: note: candidate is: test.cc:6:19: note: static void apply_func<N,ARGS>::applyTuple(std::function<void(ARGS ...)>&,const std::tuple<_Elements ...>&,ARGS ...) [with int N = 2,ARGS = {int,double}] test.cc:6:19: note: candidate expects 4 arguments,2 provided test.cc: In static member function ‘static void apply_func<N,double}]’: test.cc:27:8: instantiated from ‘void applyTuple(std::function<void(ARGS ...)>&,double}]’ test.cc:52:9: instantiated from ‘void Foo<ARGS>::run() [with ARGS = {int,double}]’ test.cc:61:17: instantiated from here test.cc:9:9: error: no matching function for call to ‘apply_func<1>::applyTuple(std::function<void(int,double>&,const double&,int&,double&)’ test.cc:9:9: note: candidate is: test.cc:6:19: note: static void apply_func<N,ARGS ...) [with int N = 1,ARGS = {}] test.cc:6:19: note: candidate expects 2 arguments,5 provided test.cc: In static member function ‘static void apply_func<N,ARGS = {}]’: test.cc:9:9: instantiated from ‘static void apply_func<N,double}]’ test.cc:27:8: instantiated from ‘void applyTuple(std::function<void(ARGS ...)>&,double}]’ test.cc:61:17: instantiated from here test.cc:9:9: error: no matching function for call to ‘get(const std::tuple<>&)’ test.cc:9:9: note: candidates are: /usr/include/c++/4.6/utility:133:5: note: template<long unsigned int _Int,class _Tp1,class _Tp2> typename std::tuple_element<_Int,std::pair<_Tp1,_Tp2> >::type& std::get(std::pair<_Tp1,_Tp2>&) /usr/include/c++/4.6/utility:138:5: note: template<long unsigned int _Int,class _Tp2> const typename std::tuple_element<_Int,_Tp2> >::type& std::get(const std::pair<_Tp1,_Tp2>&) /usr/include/c++/4.6/tuple:531:5: note: template<long unsigned int __i,class ... _Elements> typename std::__add_ref<typename std::tuple_element<__i,std::tuple<_Elements ...> >::type>::type std::get(std::tuple<_Elements ...>&) /usr/include/c++/4.6/tuple:538:5: note: template<long unsigned int __i,class ... _Elements> typename std::__add_c_ref<typename std::tuple_element<__i,std::tuple<_Elements ...> >::type>::type std::get(const std::tuple<_Elements ...>&) 我错过了什么?谢谢! 解决方法
我认为问题是applyTuple将对元组的引用作为其第二个参数:
template < typename... ARGS > void applyTuple( std::function<void(ARGS...)>& f,t ); } 但是,在run中,你传入一个指向元组的指针,因为argument_pack是一个指向元组的指针: std::tuple<ARGS...> *argument_pack; 如果你改变了运行的主体 applyTuple<ARGS...>(m_f,*argument_pack); 那么我认为你的问题应该消失. 希望这可以帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |