2011-11-20 71 views
3

香港专业教育学院一直使用Python和C++在一起有一段时间了,但从来没有尝试过实现的东西如下:Python函数作为参数传递给C++暴露类使用::升压::蟒蛇

标识像蟒蛇用户能够写类似:

def foo(a,b): 
    return a+b 

myclass.myfunc(foo) 

其中MyClass的是一个C++类暴露于蟒与Boost.Python的,条件是取一个函数与它的方法(MYFUNC):

int func(int,int) 

签名,只有这一点。

这可能吗?

林想着声明:

myclass::myfunc(boost::python::object) 

并提取Typedef的函数签名,但我只是猜测..

也许有更好的/可行的办法做到这一点,也许有些“函数'对象?

+0

也许一个更好的标题会是“蟒蛇功能参数,以提高:: python的C++类暴露” – user815129

+1

这是一个有趣的问题,我很好奇,想看看回答。 – Omnifarious

回答

3

你几乎猜到了答案。 Python函数实际上只是boost::python::object实例。然后你可以只有一个boost::function<int (int, int)>并把Python对象放在里面。

我刚刚安装我的操作系统,我没有加速,所以我不能测试它,但我认为,如果你只是这样做(没有任何包装函数),它会工作:

void function(boost::function<int (int, int)> func) { 
    // ... 
} 

// And then you expose the function as you normally would 

我期望上面的工作;如果没有这肯定会:

void function_wrap(boost::python::object func) 
{ 
    auto lambda = [func](int a, int b) -> int { 
     return boost::python::extract<int>(func(a, b)); 
    }; 
    function(boost::function<int (int, int)>(lambda)); 
} 

// And then you expose the wrapper, not the original function 
+0

这就是我之后..虐待测试它并尽快结果,谢谢 – user815129

+0

有趣。如果'func'不是可调用的,'boost :: python'会做什么?我认为:: boost :: python :: object有一个模板化的'operator()'版本来完成这个工作。 – Omnifarious

+0

@Omnifarious是的,有一个模板化的operator()'。如果对象不可调用,则会抛出异常(我不记得它被调用的是什么) - 与尝试在Python中调用不可调用对象时发生的情况几乎相同。 –

相关问题