我正在编写C ++插件,它们公开了可能属于各种类型的“属性”。简而言之,此上下文中的属性是一个变量,以及一些元数据。属性主要包含简单类型的值,如int,double,等等,但也可以是用户定义的类型/结构。
在C ++中,插件的客户端可以获取指向属性的指针,然后对其进行操作。
另一方面,从python中,简单的包装器函数可以返回一个属性值的句柄,例如:aValue = ctypes.c_double()
getPropertyValue(handleToAProperty, ctypes.byref(aValue))
适用于POD。
但是如何处理用户定义的类型?
E.g。如果用户定义的类型是:
class myType
{
private:
double a;
public:
void setA(double a);
double getA();
}
有没有办法动态地在客户端创建(??),允许客户端检索并设置上面类中成员变量'a'的值?
我可以编写一个简单的包装类,我假设但是如果可以解决这个问题会很高兴。
答案 0 :(得分:1)
类信息,甚至公共方法信息都不会自动包含在动态编译的C或C ++文件中。
C / C ++编译器知道如何验证编译文件中的公共函数,甚至执行参数/返回值类型检查,因为它们在编译时在C头文件中验证此信息
即使是Boost包装器构建器也必须导入C / C ++头文件,并且能够访问类成员等...由于在编译时获取的信息。
因此,有可能能够在正在运行的Python程序中动态地找到C / C ++数据结构和方法签名:但是你必须记住,通常这些信息甚至不在库文件中。因此,您尝试的任何方法都必须能够在程序运行时扫描头类类定义c ++文件,以便它可以执行所需的内省。
知道现在,您必须搜索解析Python模块的C ++ / C头文件,并检查它们是否适合您的需求 - 这个项目的主页确实列出了介绍性文档中的其他类似项目,所以你可能会找到一个适合你的人:
https://github.com/albertz/PyCParser(但请注意,只支持C语言。)
另一种自动公开C类的技术(sic - 它是纯C的OO框架),用于其他语言,包括Python,是gobject / gobject内省。它应该可以与Python3一起使用,但是我不知道它是否适用于C ++类,b)允许内省而不必修改类以使用gobject本身。
答案 1 :(得分:0)