提升:功能输出迭代器,重新发明轮子

whe*_*ies 0 c++ iterator stl

通常有人会去抓住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 );
}
Run Code Online (Sandbox Code Playgroud)

但是......我遇到了编译问题.相当肯定这与operator*()电话有关.我不知道如何有效地取消引用容器的对象,以便它们反对函数的效果.错误:

error C2582: 'operator =' function is unavailable in 'Back_Transform_Iterator<Container,Function>'
Run Code Online (Sandbox Code Playgroud)

我正在迭代的项目不可变.有谁知道如何解决这个问题?

Joh*_*itb 5

你可以transform改用:

transform(src.begin(), src.end(), back_inserter(container), func);
Run Code Online (Sandbox Code Playgroud)

请注意,const应用于引用类型的是无操作.所以,如果argument_typeT&的话称const argument_type不屈服回来const T&,但T&一次.因此,如果您的源项是常量,您将尝试将它们绑定到非const引用参数,operator=以防它argument_type是一个引用:

typedef int &intr;
const intr& a = 0; // fails - "const" is ignored!
Run Code Online (Sandbox Code Playgroud)