Обычно кто-то просто берет и взирает 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>'
элементы, которые я перебираю, не являются изменяемыми. Кто-нибудь знает, как решить эту проблему?