禁止操作员警告[]

时间:2019-04-12 08:45:49

标签: python c++ swig

我想在python中访问一些C ++。

DynamicArray.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];
        }
    };
}

问题是我使用operator []而swig告诉我:DynamicArray.h:25: Warning 389: operator[] ignored (consider using %extend)。好的,显然swig有很好的理由,它不能自动包装mspace::DynamicArray::operator[],对于const和常规版本,我会收到一次警告。 正如swig所建议的那样,我实际上正在做的事情是包括一个额外的文件,在该文件中我扩展了动态数组,一旦看到它可以在python中工作,那么我想使警告静音。

假装我实际上已经扩展了DynamicArray。目前,TI的详细信息还不如此,但无论我尝试什么,我都会收到警告消息。 我的界面文件array.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 -python -c++ -Wall array.iswig -python -builtin -c++ -Wall array.i

运行

我使用ubuntu-16.04存储库中的swig 3.0.8。

我想查看警告,但是当我通过扩展处理警告时,也想删除警告。有任何人知道我缺少什么。 因为,恐怕在我的项目中,我会错过尚未解决的警告,因为随着项目的发展,此类警告的列表会不断增加。

1 个答案:

答案 0 :(得分:0)

如@Davis Herring在问题下方的评论中所建议。可以使用swig使用的预处理器标志,例如-DSWIG。比您可以使用条件编译,或者在更糟糕的情况下,可以使用代码生成。也许这种方法不是最优的,因为您需要能够更改C ++头文件。

#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;

#ifndef SWIG
    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];
    }
#endif
};

}

这将起作用,因为使用%extend时可以使用swig -c++ -python -builtin来实现 getitem 或使用python插槽,但是我很乐意将答案标记为使用swig接口文件中的警告抑制。编译生成的代码时,将使用C ++编译器,因此实际上可以从扩展内的代码使用DynamicArray :: operator []。 但是,由于不是每个人都可以更改C ++头文件并通过在代码中添加许多#ifndefs SWIG来减少代码污染,所以我很高兴接受使用swig在接口文件中提供的抑制方法的答案。