好吧,这是一个很难回答的问题。问题的根本原因是没有一个python类型与C函数指针完全等价。Python函数有点接近,但是由于一些原因它们的接口不匹配。在

首先,我想从这里提到包装构造函数的技术:

http://wiki.python.org/moin/boost.python/HowTo#namedconstructors.2BAC8factories.28asPythoninitializers.29。这样就可以为对象编写一个^ {< CD1> }函数,它不直接对应于实际的C++构造函数。另外请注意,如果对象不是默认可构造的,则可能必须在boost::python::class_构造中指定boost::python::no_init,然后def一个实__init__函数。在

回到问题上来:

你通常只想传递一小部分函数吗?在这种情况下,您只需声明一个特殊的枚举(或专用类),生成一个接受该枚举的构造函数的重载,然后使用该重载来查找实际的函数指针。使用这种方法,您不能直接从python调用函数,但也没那么糟糕,而且性能将与使用真正的函数指针相同。在

如果您想提供一种通用的方法,可以用于任何python调用,那么事情就变得更复杂了。您必须向C++对象添加一个构造函数,该类接受一般的函子,例如使用^ {CD6}}或^ {CD7}}。如果需要,可以替换现有的构造函数,因为函数指针将正确转换为此类型。在

因此,假设您已经向boost::function添加了一个boost::function构造函数,那么您应该将这些函数添加到python包装代码中:struct WrapPythonCallable

{

typedef float * result_type;

explicit WrapPythonCallable(const boost::python::object & wrapped)

: wrapped_(wrapped)

{ }

float * operator()(vector* arg) const

{

//Do whatever you need to do to convert into a

//boost::python::object here

boost::python::object arg_as_python_object = /* ... */;

//Call out to python with the object - note that wrapped_

//is callable using an operator() overload, and returns

//a boost::python::object.

//Also, the call can throw boost::python::error_already_set -

//you might want to handle that here.

boost::python::object result_object = wrapped_(arg_as_python_object);

//Do whatever you need to do to extract a float * from result_object,

//maybe using boost::python::extract

float * result = /* ... */;

return result;

}

boost::python::object wrapped_;

};

//This function is the "constructor wrapper" that you'll add to SomeClass.

//Change the return type to match the holder type for SomeClass, like if it's

//held using a shared_ptr.

std::auto_ptr CreateSomeClassFromPython(

const boost::python::object & callable)

{

return std::auto_ptr(

new SomeClass(WrapPythonCallable(callable)));

}

//Later, when telling Boost.Python about SomeClass:

class_("some_class", no_init)

.def("__init__", make_constructor(&CreateSomeClassFromPython));

我忽略了关于如何在python和python之间转换指针的细节,这显然是您必须解决的问题,因为存在对象生存期问题。在

如果您需要调用从Python传递给这个函数的函数指针,那么您需要使用def这些函数Boost.Python在某个时候。第二种方法可以很好地处理这些def'd函数,但是调用它们的速度会很慢,因为每次调用对象时,对象都会不必要地在Python和Python之间进行转换。在

要解决这个问题,您可以修改CreateSomeClassFromPython来识别已知或常见的函数对象,并用它们的实际函数指针替换它们。您可以在Python中使用C++中的python对象的身份比较,使用^ {CD12}},相当于^ {CD13}}。在

最后,您当然可以将通用方法与enum方法结合起来。在做这一点时,要意识到:Python的重载规则不同于C++,在处理诸如^ {CD11}}之类的函数时,这可能会对你产生影响。Boost.Python测试的功能是按照它们的顺序来查看运行时参数是否可以转换为C++参数类型。因此,CreateSomeClassFromPython将阻止使用晚于它的单参数构造函数def'd,因为它的参数与任何python对象匹配。一定要把它放在其他单参数__init__函数之后。在

boost python 参数结构体指针_Boost.Python函数指针作为类构造函数参数相关推荐

  1. C语言之在结构体里面放很多函数指针

    1 原因 看了open ssl代码里面很多在结构体里面放很多函数指针,然后再来调用,这样比较规范和统一 2 代码实现 #include <stdio.h> #include <ass ...

  2. c语言中结构体类型定义的函数指针,结构体中定义函数指针

    结构体指针变量的定义 定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;-};struct 结构体标识符 *指针变量名;变量初始化:stru ...

  3. python提取结构体取值,python读取结构体数据

    Python向怎么向C语言传递结构体 海康的SDK,我要用Python写代码登录相机,怎么传递参数 C中的函数,需要况如下: 打算从Python发一个TCP数据包给远程服务器,数据的主体是一个C语言的 ...

  4. Python Ctypes结构体指针处理(函数参数,函数返回)

    参考网址: http://www.2cto.com/kf/201109/106444.html 本文演示了在python中调用C语言生成的动态库,返回结构体指针,并进行输出! test.c(动态库源代 ...

  5. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  6. 【C 语言】结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

    文章目录 一.结构体作为函数参数 二.结构体指针作为函数参数 三.完整代码示例 一.结构体作为函数参数 结构体变量 作为函数形参 , 在函数中 , 只能访问 该函数形参 , 无法修改 结构体内存 的值 ...

  7. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  8. c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)

    前言 C语言中的结构体作为一大难点,并且对于需要学习数据结构的同学来说,这个结构是每次上课都会遇到的,所以,我们只有更深层次的理解结构体的知识,才能更好的掌握数据结构 结构体用处 结构体到底有什么用? ...

  9. c语言的结构体能存放函数吗,在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  10. Linux学习-文件IOA1——用结构体和文件操作函数实现文件的拷贝

    Linux学习-文件IOA1--用结构体和文件操作函数实现文件的拷贝 其实我们不必选用结构体去实现模仿拷贝功能的,但是为了锻炼我们的思维以及对结构体.文件操作函数的使用,所以我们就这样来折腾自己. 学 ...

最新文章

  1. 学习用Pandas处理分类数据!
  2. CSS学习六:布局剖析
  3. tkinter中的canvas的边框问题
  4. Android 中文 API —— TextSwitcher
  5. Java System类console()方法及示例
  6. linux nslookup命令安装,在CentOS中安装nslookup命令
  7. 华为薪资等级结构表_华为21级程序员月薪曝光:月薪27w,什么概念!程序员中的战斗机...
  8. JeecgBoot低代码平台 2.4.5 版本发布,钉钉与企业微信集成版本
  9. php output_add_rewrite_var
  10. java面试宝典pdf下载_Java面试问答PDF电子书免费下载(250+问题,60页)
  11. clickhouse HDFS引擎
  12. Visio 不能使用方向键移动图形的解决办法
  13. Delphi的命令行编译命令
  14. 再读《Java编程思想 》
  15. TDH 更新Inceptor UDF步骤
  16. BZOJ4199: [Noi2015]品酒大会
  17. PCI 卫星影像处理流程(PCI+Inpho+Global Mapper+PS)
  18. linux服务器强制关机,Mac强制关机的4种方法以备不时之需
  19. 【金融项目】尚融宝项目(十)
  20. MySql 练习- 留存率计算

热门文章

  1. P3243 [HNOI2015]菜肴制作 (拓扑排序)
  2. R语言中如何给向量改变赋值
  3. 缓存雪崩及其解决方案
  4. 计算机控制技术王超,王超 研究生副院长
  5. Cookie-天使还是恶魔?
  6. Maple使用(一):Maple转Latex
  7. OpenCV和Halcon分别实现彩色图像的白平衡效果
  8. Keywords (关键字)
  9. 抖音没有播放量是什么原因,抖音播放量为0怎么解决?
  10. Unity学习笔记-切水果小游戏第一发