我有一个简单的结构,例如:
struct Config {
bool option1;
bool option2;
int arg1;
};
Run Code Online (Sandbox Code Playgroud)
使用 pybind11,我必须导出成员变量,例如:
py::class_<Config>(m, "Config")
.def_readwrite("option1", &Config::option1)
.def_readwrite("option2", &Config::option2)
.def_readwrite("arg1", &Config::arg1);
Run Code Online (Sandbox Code Playgroud)
当这些结构体比较少的时候,写上面的就可以了。但当我有大量简单的结构时,它就变得乏味了。
有没有一个方便的宏,我可以这样写:
PYBIND_EXPORT_STRUCT(Config1);
PYBIND_EXPORT_STRUCT(Config2);
...
Run Code Online (Sandbox Code Playgroud)
每个扫描并导出所有给定结构的成员变量?
如果我已经以这种形式编写结构会有帮助吗:
struct Config {
ADD_PROPERTY(bool, option1);
ADD_PROPERTY(bool, option2);
ADD_PROPERTY(int, arg1);
};
Run Code Online (Sandbox Code Playgroud)
struct我知道自省可以解决第一部分,使用typeid(arg1).name()检索名称字符串。
对于第二部分,C++不直接支持。然而,我试图通过这里的一些答案来弄清楚。
剩下的问题是如何融合上述两部分以获得我想象的PYBIND_EXPORT_STRUCT()功能的有效实现。
也就是说,我不介意以完全不同的表示形式表达我的结构(例如使用宏或元组)。只要我在使用 pybind11 导出结构成员时不必再次枚举它们,任何都可以,并且我仍然可以像config1.option1=true在 C++ 代码中一样使用变量。
我正在面对我的同事编写这样的函数定义:
typedef long double Real;
void func(const Real& x, const Real &y);
Run Code Online (Sandbox Code Playgroud)
我知道对原始类型使用 pass-by-ref 有点不好,但是呢long double?它的长度为80位,比现在普通机器上的64位指针要长。那么也许对于long double,pass-by-ref 比 pass-by-value 更有效?