我有一点C++,我想用Python来访问它。你知道吗
动态carray.h:
#include <vector>
#include <stdexcept>
namespace mspace {
template <class T>
class DynamicArray {
// lets piggyback on std::vector.
std::vector<T> m_implementation;
public:
typedef std::vector::size_type size_type;
typedef T& reference;
typedef const T& const_reference;
const_reference operator [](size_type i) const noexcept(false)
{
if (i >= m_implementation.size())
throw std::out_of_range("Ouch i >= DynamicArray.size() ");
return m_implementation[i];
}
reference operator[](size_type i) noexcept(false)
{
if (i >= m_implementation.size())
throw std::out_of_range("Ouch i >= DynamicArray.size() ");
return m_implementation[i];
}
};
}
问题是我使用操作符[],swig告诉我:DynamicArray.h:25: Warning 389: operator[] ignored (consider using %extend)
。很显然swig有很好的理由不能自动包装mspace::DynamicArray::operator[]
我得到一次常量和常规版本的警告。
正如swig所建议的,我实际上要做的是包含一个额外的文件,在这个文件中我扩展了动态数组,一旦我看到它在python中工作,那么我想消除警告。你知道吗
让我们假装我真的延长了时间。我现在有比这更详细的东西,但无论我尝试什么,我一直有警告信息。 我的接口文件数组。i:
%module mspace;
%{
#include "DynamicArray.h"
%}
%include "exception.i"
%warnfilter (389) DynamicArray::operator[] const;
%warnfilter (389) DynamicArray::operator[] ;
%warnfilter (389) DynamicArray<int>::operator[] const;
%warnfilter (389) DynamicArray<int>::operator[] ;
%warnfilter (389) mspace::DynamicArray<int>::operator[] const;
%warnfilter (389) mspace::DynamicArray<int>::operator[] ;
%include "DynamicArray.h"
%warnfilter (389) DynamicArray::operator[] const;
%warnfilter (389) DynamicArray::operator[] ;
%warnfilter (389) DynamicArray<int>::operator[] const;
%warnfilter (389) DynamicArray<int>::operator[] ;
%warnfilter (389) mspace::DynamicArray<int>::operator[] const;
%warnfilter (389) mspace::DynamicArray<int>::operator[] ;
%template (IntArray) mspace::DynamicArray<int>;
我将swig作为:swig -python -c++ -Wall array.i
或swig -python -builtin -c++ -Wall array.i
运行
我将使用ubuntu-16.04存储库中的swig3.0.8。你知道吗
我想看到警告,但我也想删除警告时,我已经通过扩展我的工作方式。有人知道我错过了什么吗。 因为,我担心在我的项目中我错过了我还没有解决的警告,因为这些警告的列表随着我的项目的增长而不断增长。你知道吗
正如@Davis Herring在以下问题的评论中所建议的那样。可以使用swig使用的预处理器标志,如
-DSWIG
。而不是使用条件编译,或者在swig的情况下,使用代码生成。也许这个方法是次优的,因为你需要能够改变C++头文件。你知道吗这是可行的,因为可以使用
%extend
来实现getitem或者在使用swig -c++ -python -builtin
时使用python插槽,但是我很乐意标记一个使用swig接口文件的警告抑制的答案。当编译生成的代码时,使用了A+C++编译器,因此可以从扩展中的代码中使用DyrimeCART::运算符[]。 然而,由于不是每个人都可以通过在代码中添加许多^ {CD4}}来改变C++头,并减少代码污染,所以我很乐意接受一个答案,该方法使用SWIG提供的接口文件中的抑制方法。你知道吗相关问题 更多 >
编程相关推荐