Быстрое подавление предупреждения оператора [] - PullRequest
4 голосов
/ 12 апреля 2019

У меня есть немного C ++, который я хочу сделать доступным в python.

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[] Я получаю предупреждение один раз для постоянной и обычной версии.То, что я на самом деле делаю, как предлагает swig, это включает дополнительный файл, в котором я расширяю динамический массив, и как только я вижу, что он работает в python, я хочу отключить предупреждение.

Позвольте мне притвориться, что я 'мы фактически расширили DynamicArray.В настоящее время у меня есть что-то менее подробное, чем это, но, что бы я ни пытался, у меня все еще есть предупреждение.Мой интерфейсный файл 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 как: swig -python -c++ -Wall array.i или swig -python -builtin -c++ -Wall array.i

Я использую swig 3.0.8 из репозиториев ubuntu-16.04.

Я хочу видеть предупреждения, но также я хочу удалить предупреждения, когда я обошел их с помощью экстента.Есть ли у кого-нибудь идея, что я скучаю.Потому что я боюсь, что в моем проекте я пропускаю предупреждения, над которыми я еще не работал, потому что список таких предупреждений продолжает расти по мере роста моего проекта.

1 Ответ

0 голосов
/ 17 апреля 2019

По предложению @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 или использоватьслоты Python при использовании swig -c++ -python -builtin, однако я был бы очень рад отметить ответ, который использует подавление предупреждений из файлов интерфейса Swig.Когда сгенерированный код компилируется, используется компилятор C ++, так что на самом деле можно использовать DynamicArray :: operator [] из кода внутри расширений.Однако, поскольку не каждый может изменить заголовки C ++ и уменьшить загрязнение кода, добавив в код множество #ifndefs SWIG, я был бы очень рад принять ответ, который использует методы подавления, которые swig обеспечивает в интерфейсных файлах.

...