簡體   English   中英

Boost:功能輸出迭代器,重塑車輪

[英]Boost: Function Output Iterator, reinventing the wheel

通常有人會去抓住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是no-op。 因此,如果argument_typeT& ,則說const argument_type不會再返回const T&而是再次返回T& 因此,如果您的源項目是常量,則在argument_type是引用的情況下,您將嘗試將其綁定到operator=的非常量引用參數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM