我目前正在使用GCC 4.4,而且我之间void*
有一个令人头痛的问题,并且指向成员函数.我正在尝试编写一个易于使用的库,用于将C++对象绑定到Lua解释器,如下所示:
LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);
Run Code Online (Sandbox Code Playgroud)
我已经完成了大部分工作,除了以下函数(特定于某个函数签名,直到我有机会对其进行概括):
template <class T>
int call_int_function(lua_State *L)
{
// this next line is problematic
void (T::*method)(int, int) = reinterpret_cast<void (T::*)(int, int)>(lua_touserdata(L, lua_upvalueindex(1)));
T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1));
(obj->*method)(lua_tointeger(L, 2), lua_tointeger(L, 3));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉Lua的人,lua_touserdata(L, lua_upvalueindex(1))
获取与闭包相关的第一个值(在这种情况下,它是指向成员函数的指针)并将其作为a返回void*
.海湾合作委员会抱怨说void*
- > void (T::*)(int, int)
是无效的演员.关于如何解决这个问题的任何想法?
我正在尝试创建一个可调用的对象,它基本上有一个绑定的unique_ptr
内部.我已经阅读了如何将unique_ptr捕获到lambda表达式中?
但我无法进一步传递lambda.以下代码无法编译,表明unique_ptr
正在进行复制.我不太明白为什么要尝试复制unique_ptr
.
#include <iostream>
#include <memory>
#include <functional>
using namespace std;
void f(std::function<void(int)> unary) {
unary(42);
unary(1337);
}
struct A{
void woof(int i) {cout<< "woof " << i << "\n";}
};
int main(){
auto another_unique = make_unique<A>();
auto bound_p = [ p = move(another_unique) ] (int i) {p->woof(i);};
bound_p(5);
f( bound_p ); // does not compute
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在调用中定义lambda内联f
,这样它就可以成为一个临时对象了,它可以被移入f
.但错误是一样的.
是否可以将这样的对象绑定/包装成callables并传递它们?
我的用例取决于unique_ptr
,但我怀疑任何删除副本c'tor的对象都会出现同样的问题.如果我错了,请告诉我或编辑主题不太通用.