无法理解 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 -&gt; cc::ActorAttribute 中的那个箭头指定了返回类型。也可以用于普通的函数和方法。

这是原生 c++ 语法,不是特定于 boost 的。

由于这段代码,python 类ActorBlueprint 的方法get_attribute 将被定义。它将有一个字符串参数,并将执行 lambda body 所做的事情(在这种情况下通过 id 返回属性)。

【讨论】:

ok 我今天学习了 C++ lambda 表达式 :) 关于 + 号,我可以模糊理解,但会再看一遍,因为我现在必须出去。 :)

以上是关于无法理解 boost python 函数导出中的语法的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Python 无法解析传递给函数的派生类型

使用boost.python,如何扩展类的__dir__函数?

Boost Python 暴露 C++ 类,构造函数采用 std::list

无法在 Boost.Python 中使用 __stdcall 编译示例

C++ 中的 boost::scoped_ptr 和 STL

禁用从 apollo-boost 导出的 ApolloClient 中的缓存