2015-12-02 268 views
0

我正在使用可變參數調用模式shown here。它對於普通的C函數來說工作正常。但我想用一個成員函數和一個明確具有實例指針作爲第一個參數的元組來使用它。將成員函數指針轉換爲普通函數指針

我想是這樣的:

template<typename Ret, typename C, typename...Args> 
int methodWrapper(const string& name, Ret (C::*func)(Args...), lua_State* L) 
{ 
    return wrap<Ret,C*,Args...>::wrapFunc(name, func, L); 
} 

但它不能爲指針類型轉換:

cannot initialize a parameter of type 'void (*)(Object *, float, float)' with an lvalue of type 'void (Object::*)(float, float)' 

在這種情況下,包裝功能模板,使指針的類型有完全匹配。

template<typename Ret, typename...Args> 
struct wrap{ 
    static int wrapFunc(const string& name, Ret (*func)(Args...), lua_State* L) 
    { 
     ... 
    } 
}; 

如何我明確的成員函數指針轉換成一個普通的函數指針取這個指針作爲第一個參數?

編輯:對於那些已經鏈接到this question,這是不一樣的。我不必傳遞一個簡單的C函數指針到具有特定接口的現有API。而我不是試圖將一個成員函數綁定到一個特定的對象。這個問題也不涉及可變的調用或元組。

+0

的可能的複製[轉換C++函數指針到c函數指針( http://stackoverflow.com/questions/19808054/convert-c-function-pointer-to-c-function-pointer) –

+0

或http://stackoverflow.com/questions/19808054/convert-c-function-pointer-如果你喜歡 –

+0

也許http://stackoverflow.com/questions/4210710/cast-pointer-to-member-function-to-normal-pointer –

回答

0

std::mem_fn這樣做。

爲了使模板匹配:我不得不顯式聲明Args tuple中作爲一類指針後跟參數組:

template<typename C, typename...Args> 
struct wrapMethod<void,C,Args...>{ 
    static int wrap(const string& name, void (C::*func)(Args...), lua_State* L) 
    { 
     tuple<C*, Args...> args = cargs<C*,Args...>::getCArgs(L, name); 

     //Return type (first template parameter) cannot be inferred. 
     variadic_call<void>(mem_fn(func), args); 

     return 0; 
    } 
};