无法理解 boost python 函数导出中的语法
Posted
技术标签:
【中文标题】无法理解 boost python 函数导出中的语法【英文标题】:Cannot understand syntax in boost python function export 【发布时间】:2019-04-05 06:43:51 【问题描述】:我现在正在查看来自 CARLA 模拟器 (http://carla.org/) 的一些代码。 它使用 boost python 向 python 公开了许多 C++ 类和成员函数。但我无法理解下面几行的语法..
void export_blueprint()
using namespace boost::python;
namespace cc = carla::client;
namespace crpc = carla::rpc;
...
class_<cc::ActorBlueprint>("ActorBlueprint", no_init)
.add_property("id", +[](const cc::ActorBlueprint &self) -> std::string
return self.GetId();
)
.add_property("tags", &cc::ActorBlueprint::GetTags)
.def("contains_tag", &cc::ActorBlueprint::ContainsTag)
.def("match_tags", &cc::ActorBlueprint::MatchTags)
.def("contains_attribute", &cc::ActorBlueprint::ContainsAttribute)
.def("get_attribute", +[](const cc::ActorBlueprint &self, const std::string &id) -> cc::ActorAttribute
return self.GetAttribute(id);
) // <=== THESE LINES
.def("set_attribute", &cc::ActorBlueprint::SetAttribute)
.def("__len__", &cc::ActorBlueprint::size)
.def("__iter__", range(&cc::ActorBlueprint::begin, &cc::ActorBlueprint::end))
.def(self_ns::str(self_ns::self))
;
下面的代码是什么
.def("get_attribute", +[](const cc::ActorBlueprint &self,
const std::string &id) -> cc::ActorAttribute
return self.GetAttribute(id);
)
是什么意思?看起来 python 类 ActorBlueprint 的函数 get_attribute 函数正在使用从 python 接口传递的新参数新(覆盖)定义。我几乎可以肯定,但有没有关于这种语法的文档?我在https://www.boost.org/doc/libs/1_63_0/libs/python/doc/html/tutorial/index.html 中找不到。
【问题讨论】:
这里有什么特别困扰您的地方?如果是lambda前的“+”号,则在***.com/questions/17822131/…和***.com/questions/18889028/…中解释 啊,我也不知道 C++ 中的 lambda 表达式。谢谢! 【参考方案1】:我会逐个元素地解释它。
.def("get_attribute", ...) //method call with arguments
+[](const cc::ActorBlueprint &self, const std::string &id) -> cc::ActorAttribute ...
// C++ lambda, passed to above method as second argument
return self.GetAttribute(id); // this is the lambda body
您可以阅读 lambda 语法 here。
此外,lambda 前面的 +
对您来说可能看起来很奇怪。它用于触发转换为普通的旧函数指针。阅读here。
lambda -> cc::ActorAttribute
中的那个箭头指定了返回类型。也可以用于普通的函数和方法。
这是原生 c++ 语法,不是特定于 boost 的。
由于这段代码,python 类ActorBlueprint
的方法get_attribute
将被定义。它将有一个字符串参数,并将执行 lambda body 所做的事情(在这种情况下通过 id 返回属性)。
【讨论】:
ok 我今天学习了 C++ lambda 表达式 :) 关于 + 号,我可以模糊理解,但会再看一遍,因为我现在必须出去。 :)以上是关于无法理解 boost python 函数导出中的语法的主要内容,如果未能解决你的问题,请参考以下文章
使用boost.python,如何扩展类的__dir__函数?
Boost Python 暴露 C++ 类,构造函数采用 std::list
无法在 Boost.Python 中使用 __stdcall 编译示例