2014-03-30 28 views
0

我創建了一個存儲函數及其參數類型的MemberFunctionWrapper模板類。它有一個調用方法,該方法接受void *的向量並在調用函數之前將它們轉換爲函數調用所需的參數類型。使用可變參數模板將void *存儲在std :: vector中以形成函數參數

我的問題是,包裝只能採取固定數量的函數參數 (_arg0,_arg1)。
我想讓該類採用任意數量的函數參數(arg0,arg1,arg2 ... argX)我該如何實現這一目標?

在此先感謝

class Foo 
{ 
public: 
    void foo(int a, const string& b); 
}; 

template< class _obj, class _function, class _arg0, class _arg1 > 
class MemberFunctionWrapper 
{ 
    const _function m_memberfunction; 

public: 
    MemberFunctionWrapper(_function memFn) 
     : m_memberfunction(memFn) 
    { } 

    void call(std::shared_ptr<void>& obj, 
       const std::vector<std::shared_ptr<void>>& args) 
    { 
     m_memberfunction(*static_cast< _obj* >(obj.get()), 
          *static_cast< _arg0* >(args.at(0).get()), 
          *static_cast< _arg1* >(args.at(1).get())); 
    } 

}; 

int main() 
{ 
    std::shared_ptr<int> i(new int(88)); 
    std::shared_ptr<string> s(new string("hello")); 
    std::shared_ptr<Foo> foo(new Foo); 

    std::shared_ptr<void> iVoid = std::static_pointer_cast<void>(i); 
    std::shared_ptr<void> sVoid = std::static_pointer_cast<void>(s); 
    std::shared_ptr<void> fooVoid = std::static_pointer_cast<void>(foo); 

    MemberFunctionWrapper 
    < 
     Foo, 
     decltype(std::mem_fn(&Foo::foo)), 
     int, 
     string 
    > wrapper(&Foo::foo); 

    wrapper.call(fooVoid, std::vector<std::shared_ptr<void>>{iVoid, sVoid}); 

    system("pause"); 
} 

回答

0

以下可能會有所幫助:https://ideone.com/l7yAJN

template<typename F> class MemberFunctionWrapper; 

template<class Obj, class Ret, typename ... Args> 
class MemberFunctionWrapper<Ret (Obj::*)(Args...)> 
{ 
    typedef Ret (Obj::*MemberFunction)(Args...); 
    const MemberFunction m_memberfunction; 

    template <std::size_t ... Is> 
    void call(std::shared_ptr<void>& obj, 
       const std::vector<std::shared_ptr<void>>& args, 
       index_sequence<Is...>) 
     { 
      (static_cast<Obj*>(obj.get())->*m_memberfunction) 
       (*static_cast<typename std::remove_reference<Args>::type*>(args.at(Is).get())...); 
     } 
public: 
    MemberFunctionWrapper(MemberFunction memFn) : m_memberfunction(memFn) 
    {} 

    void call(std::shared_ptr<void>& obj, 
       const std::vector<std::shared_ptr<void>>& args) 
    { 
     assert(args.size() == sizeof...(Args)); 
     call(obj, args, make_index_sequence<sizeof...(Args)>()); 
    } 

}; 
相關問題