2010-09-09 46 views
0

通常有人会去抢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>' 

我正在迭代的项目不可变。任何人都知道如何解决这个问题?

+2

任何理由不使用'的std :: transform'和'back_inserter'? – 2010-09-09 21:10:43

+0

Gah!把它作为答案,让我给你信贷。 – wheaties 2010-09-09 21:13:23

回答

5

您可以使用transform代替:

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

注意const应用于引用类型是一个空操作。因此,如果argument_typeT&,则表示const argument_type不会返回const T&,而是返回T&。所以如果你的源项目是不变的,你会尝试将其绑定到案件的operator=非const引用参数argument_type是一个参考:

typedef int &intr; 
const intr& a = 0; // fails - "const" is ignored! 
+0

达到了我的每日涨幅限制,将不得不稍后再给你+1。 – wheaties 2010-09-09 21:22:30