簡體   English   中英

SWIG c++ / python:如何處理抽象 ZA2F2ED4F8EBC2CABBD4C21A29 的 shared_ptr 的 std::map

[英]SWIG c++ / python: how to handle a std::map of shared_ptr of abstract class

如何使用 SWIG 從以下 c++ 代碼處理 python 中抽象方法的 map :

class A : Base {
    virtual int f() = 0;
};

class B : public A {
    int f() { return 10 }; 
}; 

class C : public A {
    int f() { return 20 }; 
}; 

std::map< std::string, std::shared_ptr<A>> my_map; 

在 python 中,我也想做類似的事情:

my_B = B()
my_map["foo"] = my_B

或者可能更簡單:

my_map["foo"] = B()

為了使用跨語言多態性,我必須明確 A 或 B 可以是導演 class。

我的問題:

  1. 與此問題相關聯的 minimum.i 文件可能是什么?
  2. 我還讀到,如果刪除了 my_B,這可能會導致 python / C++ 棘手的所有權問題。 如何輕松地將“my_B”所有權從 python 轉移到 C++?

非常感謝你的幫助

一個。

這是一個跟蹤構造/破壞以顯示共享指針的引用計數正在工作的工作示例:

測試.h

#include <map>
#include <memory>
#include <string>
#include <iostream>

class A {
public:
    virtual int f() = 0;
    A() { std::cout << "A()" << std::endl; }
    virtual ~A() { std::cout << "~A()" << std::endl; }
};

class B : public A {
public:
    int f() { return 10; }
    B() { std::cout << "B()" << std::endl; }
    virtual ~B() { std::cout << "~B()" << std::endl; }
};

class C : public A {
public:
    int f() { return 20; }
    C() { std::cout << "C()" << std::endl; }
    virtual ~C() { std::cout << "~C()" << std::endl; }
};

std::map< std::string, std::shared_ptr<A>> my_map;

測試.i

%module test

%{
#include "test.h"
%}

%include <std_map.i>
%include <std_shared_ptr.i>
%include <std_string.i>

// declare all visible shared pointers so SWIG generates appropriate wrappers
// before including the header.
%shared_ptr(A)
%shared_ptr(B)
%shared_ptr(C)

%include "test.h"

// Declare the template instance used so SWIG will generate the wrapper.
%template(Map) std::map<std::string, std::shared_ptr<A>>;

Output:

>>> import test
>>>
>>> m=test.cvar.my_map    # global variables are in module's cvar.
>>> m['foo'] = test.C()
A()
C()
>>> m['foo'].f()
20
>>> del m['foo']  # only reference, so it is freed
~C()
~A()
>>> b = test.B()  # 1st reference
A()
B()
>>> m['bar'] = b  # 2nd reference
>>> del m['bar']  # NOT freed.
>>> del b         # now it is freed.
~B()
~A()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM