創建typedefd類型的變量我有痛飲項目設置生成Python代碼。我有一個std::string
向typedef
和Message
一個say(Message)
功能。我可以用python中的字符串調用say
。我希望能夠創建類型爲Message
的變量,並且Message
類型被導出到庫中,但不是python包裝器。下面是我的文件:在痛飲
test.h
#include <string>
#include <iostream>
typedef std::string Message
void say(Message s);
TEST.CPP
#include "test.h"
void say(Message s)
{
std::cout << s << std::endl;
}
test.i
%module test
%{
#include "test.h"
%}
typedef std::string Message;
%include "std_string.i"
%include "test.h"
Python的例子
import test
test.say('a')
# >>> a
# What I want to be able to do
msg = test.Message('a')
# >>> Traceback (most recent call last):
# >>> File "<stdin>", line 1, in <module>
# >>> AttributeError: module 'test' has no attribute 'Message'
我的實際使用案例還涉及對其他類型(主要是枚舉)的typedefs,如果這些案例採取了不同的處理方式,我很好奇。我相信我可以將對象包裝在SWIG綁定的類中,然後修改SWIG生成的類(或者可以使用SWIG類型映射),但是我覺得這是一個迂迴解決方案,我認爲這是一種常見的情況。
我認爲這可能是訪問string
標題中的代碼的問題,但如果我嘗試敲入類似int
之類的東西,我會遇到同樣的問題。
我的最好的方法,到目前爲止已被包裝的模板:
template<typename T>
class Wrapper
{
public:
Wrapper(T x) : data(x){};
T data;
T operator()() { return data; };
};
而且相應的%template
指令在test.i:
%template(Message) Wrapper<std::string>;
不幸的是,這似乎有幾個缺點至今:
- 你必須實際LY打電話
operator()
,即需要test.Message('a')()
被稱爲 - 您需要可以選用一些條件編譯或名稱,包裝的東西從不同的typedef;否則,
test.say
將不接受包裝或字符串,因此根本無法使用。 - 它似乎並不與施工錯誤枚舉工作。
我也認爲我可能很聰明,並改變operator*
只是返回正在包裝,但它看起來像SWIG包裹什麼是返回無論如何。
我建議你使用'const char *',因爲'std :: string'不是'POC'類型,並且內存分配在堆上,不管它是調試版本還是發行版本,其操作都是不同的。我預計通過包含'%include「std_string.i」'你可以創建一個'std :: string'實例。你有沒有嘗試過使用這個參數? –
我的預期是錯誤的,但我仍然建議您在界面上使用POC類型。 –
我希望能夠將'%include std_string.i'或%import std_string.i'中的字符串實例化爲'std_string.i'模板'string'作爲'basic_string'。奇怪的是,這些似乎都沒有導入一個可以創建實例的對象。也許這是因爲SWIG似乎通過將字符串映射到目標語言字符串來處理字符串? –
danielunderwood