我现在正在从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中找不到一个。
答案 0 :(得分:0)
我将逐个元素进行解释。
.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主体所做的事情(在这种情况下,通过id返回属性)。