c++ - Boost : Function Output Iterator, 重新发明轮子

标签 c++ stl iterator

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

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

最佳答案

您可以改用transform:

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

请注意,应用于引用类型的 const 是空操作。因此,如果 argument_typeT&,那么说 const argument_type 不会返回 const T&,而是返回 T& 再次。因此,如果您的源项是常量,您将尝试将它们绑定(bind)到 operator= 的非常量引用参数,以防 argument_type 是引用:

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

关于c++ - Boost : Function Output Iterator, 重新发明轮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3680601/

相关文章:

c++ - 传递迭代器值而不是对函数的引用

c++ - 在递归 C++ 函数中捕获 "Stack Overflow"异常

c++ - 每次我将第一个整数放入数组时,方法都会崩溃。操作不好?

c++ - 我应该始终为数字类型使用适当的文字吗?

c++ - STL::Map - 遍历列表还是使用查找?

java - 从 ArrayList 中获取匹配的子集

c++ - 在树转换中结合模板和继承

C++0x 性能改进

c++ - 减少 gdb 打印中的垃圾

c++ - vector 迭代和删除