繁体   English   中英

将成员函数指针转换为普通函数指针

[英]Convert member function pointer to ordinary function pointer

我正在使用此处显示的可变呼叫模式。 对于普通的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)'

在这种情况下,wrap函数是模板化的,因此指针的类型必须完全匹配。

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

如何将成员函数指针显式转换为以this指针为第一个参数的普通函数指针?

编辑:对于那些已将我链接到此问题的人 ,这是不一样的。 我不必将普通C函数指针传递给具有特定接口的现有API。 而且我没有尝试将成员函数绑定到特定对象。 这个问题也不涉及可变参数调用或元组。

std :: mem_fn执行此操作。

为了使模板匹配:我必须将args元组显式声明为Class指针,后跟参数pack:

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;
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM