Boost: функция Output Iterator, заново изобретающая колесо - PullRequest
0 голосов
/ 10 сентября 2010

Обычно кто-то просто берет и взирает Boost на Итератор вывода функции , но я не могу использовать Boost на работе. Тем не менее, я просто хочу использовать функцию copy для обхода коллекции, вызова функции для каждого элемента, получения выходных данных этой функции и, наконец, push_back для другой коллекции. Я написал некоторый код:

#include <iterator>
using std::iterator;
using std::output_iterator_tag;

template<typename Container, typename Function>
struct Back_Transform_Iterator : public iterator<output_iterator_tag,void,void,void,void>{
    explicit Back_Transform_Iterator(Container &_container, const Function &_function) 
        : m_Container(_container),
        m_Function(_function){}

    Back_Transform_Iterator<Container,Function>& operator= (const typename Function::argument_type &value){ 
      m_Container.push_back( m_Function( value ) );

      return *this; 
    }

    Back_Transform_Iterator<Container,Function>& operator* (){ return *this; }
    Back_Transform_Iterator<Container,Function>& operator++ (){ return *this; }
    Back_Transform_Iterator<Container,Function> operator++ (int){ return *this; }

    typedef Container container_type;

private:
    Container   &m_Container;
    Function    m_Function;
};

template<typename C, typename F>
Back_Transform_Iterator<C,F> back_transform_inserter(C &_container, F &_unary_function){
    return Back_Transform_Iterator<C,F>( _container, _unary_function );
}

но ... У меня проблемы с компиляцией. Совершенно уверен, что это связано с вызовом operator*(). Я понятия не имею, как эффективно разыменовать объекты контейнера, чтобы они возражали против эффектов функции. Ошибка:

error C2582: 'operator =' function is unavailable in 'Back_Transform_Iterator<Container,Function>'

элементы, которые я перебираю, не являются изменяемыми. Кто-нибудь знает, как решить эту проблему?

1 Ответ

5 голосов
/ 10 сентября 2010

Вы можете использовать transform вместо:

transform(src.begin(), src.end(), back_inserter(container), func);

Обратите внимание, что const, примененный к ссылочному типу, является недопустимым. Таким образом, если argument_type равно T&, то выражение const argument_type не возвращает const T&, а T& снова. Поэтому, если ваши исходные элементы постоянны, вы можете попытаться привязать их к неконстантному ссылочному параметру operator=, если argument_type является ссылкой:

typedef int &intr;
const intr& a = 0; // fails - "const" is ignored!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...