操作员开关警告抑制[]

2024-09-27 21:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一点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.iswig -python -builtin -c++ -Wall array.i运行

我将使用ubuntu-16.04存储库中的swig3.0.8。你知道吗

我想看到警告,但我也想删除警告时,我已经通过扩展我的工作方式。有人知道我错过了什么吗。 因为,我担心在我的项目中我错过了我还没有解决的警告,因为这些警告的列表随着我的项目的增长而不断增长。你知道吗


Tags: 警告sizeincludetypeoperatorimplementationswigint
1条回答
网友
1楼 · 发布于 2024-09-27 21:24:12

正如@Davis Herring在以下问题的评论中所建议的那样。可以使用swig使用的预处理器标志,如-DSWIG。而不是使用条件编译,或者在swig的情况下,使用代码生成。也许这个方法是次优的,因为你需要能够改变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来实现getitem或者在使用swig -c++ -python -builtin时使用python插槽,但是我很乐意标记一个使用swig接口文件的警告抑制的答案。当编译生成的代码时,使用了A+C++编译器,因此可以从扩展中的代码中使用DyrimeCART::运算符[]。 然而,由于不是每个人都可以通过在代码中添加许多^ {CD4}}来改变C++头,并减少代码污染,所以我很乐意接受一个答案,该方法使用SWIG提供的接口文件中的抑制方法。你知道吗

相关问题 更多 >

    热门问题