Обычно кто-то просто заходил и хватал Boost Function Output Iterator, но мне не разрешено использовать Boost на работе. Тем не менее, я просто хочу использовать функцию copy
для перемещения коллекции, вызова функции на каждом элементе, получения результата этой функции и, наконец, push_back
в другую коллекцию. Я написал код:Boost: Function Output Iterator, изобретая колесо
#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>'
Элементы, которые я выполняю, не изменяются. Кто-нибудь знает, как решить эту проблему?
Любой причиной вы не используете 'станд :: transform' и 'back_inserter'? –
Gah! Положите это как ответ и позвольте мне поблагодарить вас за это. – wheaties