SWIG: Как получить значение обернутого std :: shared_ptr из SwigPyobject - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь создать интерфейс SWIG Python для библиотеки C ++, добавить обертки Python для некоторых функций, и я был бы очень признателен за помощь от кого-то, имеющего опыт работы с SWIG.

Пока у меня есть такойисточники:

test.h

namespace Test {
class CodeResponseEvent {
 public:
  CodeResponseEvent(std::string activation_code);
  std::string getActivationCode() const;
 private:
  const std::string activation_code_;
};

class CodeRequestEvent {
 public:
  CodeRequestEvent(std::string user_id);
  std::shared_ptr<CodeResponseEvent> execute();

 private:
  const std::string user_id_;
};
}

test.i

%module test
%include std_string.i
%include <std_shared_ptr.i>

%{#include "test.h"%}
%include "test.h"
%shared_ptr(Test::CodeResponseEvent);

Python-код выглядит так:

codeResponse = test.CodeRequestEvent("user").execute()

В результате я получаюзначение

<Swig Object of type 'std::shared_ptr< Test::CodeResponseEvent> *'>

Итак, вопрос в том, как развернуть этот SwigPyobject для вызова метода getActivationCode ()?

1 Ответ

0 голосов
/ 15 мая 2019

Вы можете просто вызвать метод объекта, но учтите, что вам нужно объявить% shared_ptr перед%, включая заголовок. Вот рабочий автономный пример. Я только что% inline заголовок для решения с одним файлом:

%module test
%include std_string.i
%include <std_shared_ptr.i>

%shared_ptr(Test::CodeResponseEvent);

%inline %{
#include <memory>
#include <string>
namespace Test {
class CodeResponseEvent {
 public:
  CodeResponseEvent(std::string activation_code) : activation_code_(activation_code) {}
  std::string getActivationCode() const { return activation_code_; }
 private:
  const std::string activation_code_;
};

class CodeRequestEvent {
 public:
  CodeRequestEvent(std::string user_id):user_id_(user_id) {};
  std::shared_ptr<CodeResponseEvent> execute() { return std::make_shared<CodeResponseEvent>("Hi"); }

 private:
  const std::string user_id_;
};
}
%}

Демо ниже. Обратите внимание, что r является прокси, а не универсальным объектом Swig, если общий указатель объявлен перед использованием:

>>> import test
>>> r = test.CodeRequestEvent('user').execute()
>>> r
<test.CodeResponseEvent; proxy of <Swig Object of type 'std::shared_ptr< Test::CodeResponseEvent > *' at 0x0000027AF1F97330> >
>>> r.getActivationCode()
'Hi'
...