Невозможно понять синтаксис в экспорте функции Boost Python - PullRequest
0 голосов
/ 05 апреля 2019

Сейчас я смотрю некоторые коды из симулятора CARLA (http://carla.org/).
. Он предоставляет множество классов C ++ и функций-членов для python с использованием boost python. Но я не могу понять синтаксис из строк ниже ..

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);
    })  

? Похоже, что функция класса get_attribute класса ActorBlueprint была заново (переопределена) определена с новыми аргументами, передаваемыми из интерфейса python.Я почти уверен, но есть ли документ об этом синтаксисе? Я не смог найти его в https://www.boost.org/doc/libs/1_63_0/libs/python/doc/html/tutorial/index.html.

1 Ответ

0 голосов
/ 05 апреля 2019

Я объясню это элемент за элементом.

.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

Вы можете прочитать о лямбда-синтаксисе здесь .Кроме того, + перед лямбдой может показаться вам странным.Он используется для запуска преобразования в простой старый указатель на функцию.Читайте здесь .

Эта стрелка в лямбде -> cc::ActorAttribute указывает тип возвращаемого значения.Он также может использоваться для обычных функций и методов.

Это собственный синтаксис c ++, а не что-то конкретное для повышения.

В результате этого кода, метод класса ActorBlueprint класса Pythonget_attribute будет определено.Он будет иметь один строковый аргумент и будет делать то же самое, что и лямбда-тело (в этом случае возвращать атрибут по id).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...