为什么 swig 将 python 列表无缝转换为 std::vector 而不是 std::set?
why swig casts python list to std::vector seamlessly and not std::set?
为了将基本的 C++ class 扩展到 python,我使用 swig 进行了一些试验。我发现了一个行为
与到目前为止我无法解释的集合的使用有关。这是我的脚本:
MyClass.h:
#pragma once
#include <set>
#include <vector>
class MyClass
{
public:
MyClass();
void setSTLVector(const std::vector<int> &vector);
void setSTLSet(const std::set<int> &set);
private:
std::vector<int> _stlVector;
std::set<int> _stlSet;
};
MyClass.cpp:
#include "MyClass.h"
MyClass::MyClass()
{
}
void MyClass::setSTLVector(const std::vector<int> &vector)
{
_stlVector = vector;
}
void MyClass::setSTLSet(const std::set<int> &set)
{
_stlSet = set;
}
MyClass.i:
%module MyClass
%{
#include "MyClass.h"
%}
%include <typemaps.i>
%include "std_vector.i"
%template(IntVector) std::vector<int>;
%include "std_set.i"
%template(IntSet) std::set<int>;
%include "MyClass.h"
编译时一切(似乎)都正常。我的误会始于 运行 我扩展到 python。确实:
In [1]: import MyClass
In [2]: cls = MyClass.MyClass()
In [3]: cls.setSTLVector([1,2,3,4])
至少按照我的预期完美工作,即 python list of integers
是 cast 内部 std::vector<int>
。对于集合:
In [1]: import MyClass
In [2]: cls = MyClass.MyClass()
In [3]: cls.setSTLVector({1,2,3,4})
触发以下错误:
TypeError: in method 'MyClass_setSTLSet', argument 2 of type 'std::set< int,std::less< int >,std::allocator< int > > const &'
这个错误可能与我在使用我在 swig 中定义的类型声明集合时遇到的另一个错误有关:
In [1]: import MyClass
In [2]: cls = MyClass.IntSet({1,2,3,4})
给出:
NotImplementedError: Wrong number or type of arguments for overloaded function 'new_IntSet'.
Possible C/C++ prototypes are:
std::set< int >::set(std::less< int > const &)
std::set< int >::set()
std::set< int >::set(std::set< int > const &)
你知道我做错了什么吗?或者这是正常行为吗?
std_set.i
的类型映射不直观地期望 Python list
作为输入而不是 set
.
>>> import MyClass
>>> cls = MyClass.MyClass()
>>> cls.setSTLVector([1,2,3,4]) # works
>>> cls.setSTLSet([1,2,3,4]) # works
>>> cls.setSTLSet({1,2,3,4}) # doesn't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\MyClass.py", line 385, in setSTLSet
return _MyClass.MyClass_setSTLSet(self, set)
TypeError: in method 'MyClass_setSTLSet', argument 2 of type 'std::set< int,std::less< int >,std::allocator< int > > const &'**strong text**
您必须定义自己的自定义类型映射才能将 set
作为输入。
为了将基本的 C++ class 扩展到 python,我使用 swig 进行了一些试验。我发现了一个行为 与到目前为止我无法解释的集合的使用有关。这是我的脚本:
MyClass.h:
#pragma once
#include <set>
#include <vector>
class MyClass
{
public:
MyClass();
void setSTLVector(const std::vector<int> &vector);
void setSTLSet(const std::set<int> &set);
private:
std::vector<int> _stlVector;
std::set<int> _stlSet;
};
MyClass.cpp:
#include "MyClass.h"
MyClass::MyClass()
{
}
void MyClass::setSTLVector(const std::vector<int> &vector)
{
_stlVector = vector;
}
void MyClass::setSTLSet(const std::set<int> &set)
{
_stlSet = set;
}
MyClass.i:
%module MyClass
%{
#include "MyClass.h"
%}
%include <typemaps.i>
%include "std_vector.i"
%template(IntVector) std::vector<int>;
%include "std_set.i"
%template(IntSet) std::set<int>;
%include "MyClass.h"
编译时一切(似乎)都正常。我的误会始于 运行 我扩展到 python。确实:
In [1]: import MyClass
In [2]: cls = MyClass.MyClass()
In [3]: cls.setSTLVector([1,2,3,4])
至少按照我的预期完美工作,即 python list of integers
是 cast 内部 std::vector<int>
。对于集合:
In [1]: import MyClass
In [2]: cls = MyClass.MyClass()
In [3]: cls.setSTLVector({1,2,3,4})
触发以下错误:
TypeError: in method 'MyClass_setSTLSet', argument 2 of type 'std::set< int,std::less< int >,std::allocator< int > > const &'
这个错误可能与我在使用我在 swig 中定义的类型声明集合时遇到的另一个错误有关:
In [1]: import MyClass
In [2]: cls = MyClass.IntSet({1,2,3,4})
给出:
NotImplementedError: Wrong number or type of arguments for overloaded function 'new_IntSet'.
Possible C/C++ prototypes are:
std::set< int >::set(std::less< int > const &)
std::set< int >::set()
std::set< int >::set(std::set< int > const &)
你知道我做错了什么吗?或者这是正常行为吗?
std_set.i
的类型映射不直观地期望 Python list
作为输入而不是 set
.
>>> import MyClass
>>> cls = MyClass.MyClass()
>>> cls.setSTLVector([1,2,3,4]) # works
>>> cls.setSTLSet([1,2,3,4]) # works
>>> cls.setSTLSet({1,2,3,4}) # doesn't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\MyClass.py", line 385, in setSTLSet
return _MyClass.MyClass_setSTLSet(self, set)
TypeError: in method 'MyClass_setSTLSet', argument 2 of type 'std::set< int,std::less< int >,std::allocator< int > > const &'**strong text**
您必须定义自己的自定义类型映射才能将 set
作为输入。