通常有人会去抢Boost的Function Output Iterator,但我不允许在工作中使用Boost。也就是说,我只是想用copy
函数来遍历一个集合,在每个项目上调用一个函数,获取该函数的输出,并最终将其转换为另一个集合。我写了一些代码:Boost:函数输出迭代器,重塑车轮
#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>'
我正在迭代的项目不可变。任何人都知道如何解决这个问题?
任何理由不使用'的std :: transform'和'back_inserter'? – 2010-09-09 21:10:43
Gah!把它作为答案,让我给你信贷。 – wheaties 2010-09-09 21:13:23