2010-09-09 2 views
0

Обычно кто-то просто заходил и хватал Boost Function Output Iterator, но мне не разрешено использовать Boost на работе. Тем не менее, я просто хочу использовать функцию copy для перемещения коллекции, вызова функции на каждом элементе, получения результата этой функции и, наконец, push_back в другую коллекцию. Я написал код:Boost: Function Output Iterator, изобретая колесо

#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

Любой причиной вы не используете 'станд :: transform' и 'back_inserter'? –

+0

Gah! Положите это как ответ и позвольте мне поблагодарить вас за это. – wheaties

ответ

5

Вы можете использовать transform вместо:

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

Обратите внимание, что const применяется на ссылочного типа является не оп. Так что если argument_type - T&, то const argument_type не возвращает const T&, но T& еще раз. Так что, если ваши элементы источника постоянны вы бы попытаться связать их с неконстантным опорным параметром operator= в случае, argument_type является ссылкой:

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

Достигнутый мой дневной лимит upvotes, должен будет вернуться позже, чтобы дать вам +1. – wheaties

Смежные вопросы