相关疑难解决方法(0)

在void*和指向成员函数的指针之间进行转换

我目前正在使用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)是无效的演员.关于如何解决这个问题的任何想法?

c++ lua pointers pointer-to-member

13
推荐指数
3
解决办法
2万
查看次数

是否可以传递具有捕获的不可复制(移动)值的lambda?

我正在尝试创建一个可调用的对象,它基本上有一个绑定的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的对象都会出现同样的问题.如果我错了,请告诉我或编辑主题不太通用.

c++ lambda unique-ptr c++14

0
推荐指数
1
解决办法
467
查看次数

标签 统计

c++ ×2

c++14 ×1

lambda ×1

lua ×1

pointer-to-member ×1

pointers ×1

unique-ptr ×1