代码之家  ›  专栏  ›  技术社区  ›  wheaties

Boost:函数输出迭代器,重新设计轮子

  •  0
  • wheaties  · 技术社区  · 14 年前

    通常有人会去抓Boost的 Function Output Iterator 但我不允许在工作中使用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 回复  |  直到 14 年前
        1
  •  5
  •   Johannes Schaub - litb    14 年前

    你可以使用 transform 而是:

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

    注意 const 应用于引用类型是no-op。因此如果 argument_type T& 然后说 const argument_type 不退让 const T& 但是 T&P; 再一次。因此,如果源项是常量,您将尝试将它们绑定到的非常量引用参数 operator= 万一 阿格伦特式 是参考文献:

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