gpt4 book ai didi

c++ - 指向静态成员函数的指针是 "invalid"作为 g++ 的模板参数

转载 作者:行者123 更新时间:2023-11-30 04:28:25 25 4
gpt4 key购买 nike

这是我处理将 C++ 类暴露给 Lua 的一些实际代码,示例:

#include <lua5.1/lua.hpp>
#include <tuple>

//in actual code, lots of specializations of these C++<=>Lua's stack helper functions. Here it's just a sample.
template<typename T> T to(lua_State*, int);
template<> int to(lua_State* l, int i){
return lua_tointeger(l, i);
}
template<typename T> void push(lua_State*, T);
template<> void push(lua_State* l, int val){
lua_pushinteger(l, val);
}

//in actual code, placed in a header
template<typename T, T> class function_proxy{
static_assert(sizeof(T)!=sizeof(T), "Error: function_proxy works with functions (duh)");
};

template<typename Return, typename... Args, Return(*func)(Args...)> class function_proxy<Return(*)(Args...), func>{
static Return call(lua_State* l, Args... args){
return func(args...);
}
template<typename... retrieved> static Return call(lua_State* l, retrieved... read){
return call(l, read..., to<typename std::tuple_element<sizeof...(read), std::tuple<Args...> >::type >(l, 1+sizeof...(read)));
}
public:
static int wrapper(lua_State* l){
push(l, call(l));
return 1;
}
};

//in actual code, inner class of a template class in another header
template<typename CT, CT> class member_helper{
static_assert(sizeof(CT)!=sizeof(CT), "Error: member_helper works with members of T (duh)");
};
//Just one of the actual partial specializations, to combine constness and the return of void or non-void
template<typename Class, typename Return, typename... Args, Return(Class::*fun)(Args...)> struct member_helper<Return(Class::*)(Args...), fun>{
static Return as_free(Class& obj, Args... args){
return (obj.*fun)(args...);
}
static int worker(lua_State* l, Class& obj, bool is_const, bool write){
if(write) throw "Cannot write a member function.";
//ERROR HERE: template argument 2 is invalid. Not very helpful message.
lua_pushcclosure(l, function_proxy<decltype(&as_free), &as_free>::wrapper, 0);
return 1;
}
};

struct Test{
int test(int arg){ return arg*3; }
};

int test_as_free(int arg){ return arg*3; }

int main(){
lua_State* l=luaL_newstate();
Test t;
//works fine
lua_pushcclosure(l, function_proxy<decltype(&test_as_free), &test_as_free>::wrapper, 0);
//does not work
member_helper<decltype(&Test::test), &Test::test>::worker(l, t, false, false);
}

获取指针时代码失败 function_proxy<decltype(&as_free), &as_free>::wrapper , 即使在 main 中做了非常相似的事情.我认为获取自由函数的指针与获取静态成员函数的指针之间没有任何区别。这是 this 的实例吗? g++ 错误(请注意,我使用 -std=c++0x 进行编译,并且该错误似乎已在 C++11 中得到修复)?

最佳答案

这是一个 g++ bug并得到承认。

关于c++ - 指向静态成员函数的指针是 "invalid"作为 g++ 的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10174920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com