перебор мапы по значению
От: IROV..  
Дата: 21.10.05 14:27
Оценка:
    template<class T_Function >
    class FMapSecondBinder
        : public T_Function
    {
    public:
        template<class T_Pair>
            void operator()( const T_Pair &Value )const
        {
            T_Function::operator()(Value.second);
        }
    };

    template<class T_Function >
        const FMapSecondBinder<T_Function> & second_binder(const T_Function &Function)
    {
        return *(const FMapSecondBinder<T_Function>*)(&Function);
    }



Насколько опастны эти трюки

Юзать так..


std::for_each(Map.begin(),Map.end(),second_binder(MyFunctor()));
я не волшебник, я только учусь!
Re: перебор мапы по значению
От: Аноним  
Дата: 21.10.05 14:33
Оценка:
IRO>std::for_each(Map.begin(),Map.end(),second_binder(MyFunctor()));
IRO>[/ccode]

Здесь second_binder вернет ссылку на объект в стеке, который после возврата из second_binder может быть разрушен. Опасно ли использовать ссылки на объекты, которых нет — решай сам.
Re[2]: перебор мапы по значению
От: IROV..  
Дата: 21.10.05 14:41
Оценка:
Здравствуйте, Аноним, Вы писали:

IRO>>std::for_each(Map.begin(),Map.end(),second_binder(MyFunctor()));

IRO>>[/ccode]

А>Здесь second_binder вернет ссылку на объект в стеке, который после возврата из second_binder может быть разрушен. Опасно ли использовать ссылки на объекты, которых нет — решай сам.


Но мне кажеться что const T & продлит жизнь объекту..

хорошо тогда вот так..

    template<class T_Function >
       FMapSecondBinder<T_Function> second_binder(const T_Function &Function)
    {
        return *(const FMapSecondBinder<T_Function>*)(&Function);
    }
я не волшебник, я только учусь!
Re[3]: перебор мапы по значению
От: Аноним  
Дата: 21.10.05 14:49
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Здравствуйте, Аноним, Вы писали:


IRO>>>std::for_each(Map.begin(),Map.end(),second_binder(MyFunctor()));

IRO>>>[/ccode]

А>>Здесь second_binder вернет ссылку на объект в стеке, который после возврата из second_binder может быть разрушен. Опасно ли использовать ссылки на объекты, которых нет — решай сам.


IRO>Но мне кажеться что const T & продлит жизнь объекту..


IRO>хорошо тогда вот так..


IRO>
IRO>    template<class T_Function >
IRO>       FMapSecondBinder<T_Function> second_binder(const T_Function &Function)
IRO>    {
IRO>        return *(const FMapSecondBinder<T_Function>*)(&Function);
IRO>    }
IRO>


Работать может и будет, потому что нет виртуальных функций и производный класс не вводит доп. членов-данных, но скорее всего здесь "неопределенное поведение". Хотя в большинстве случаев работать видимо будет.
Re: перебор мапы по значению
От: Кодт Россия  
Дата: 21.10.05 19:10
Оценка:
Здравствуйте, IROV.., Вы писали:

Может быть, не мучать животинку, а написать вот так
template<class F>
struct compose_select2nd_t
{
  F f_;
  compose_select2nd_t(F f) : f_(f) {}
  template<class P> void operator()(P& p) const { f_(p.second); }

  F func() const { return f_; } // на тот случай, если нужно извлечь его из результата for_each
};
template<class F> compose_select2nd_t<F> compose_select2nd(F f) { return compose_select2nd_t<F>(f); }

....
Func f = for_each(m.begin(), m.end(), compose_select2nd(Func(123))).func();

При желании (с потерями в гибкости, но с приростом скорости) можно вместо копии F f_ держать ссылку const F& f_.

Или вот так...
for_each(m.begin(),m.end(), compose1(Func(123),select2nd<YourMap::value_type>()));


Статья на codeproject: http://www.codeproject.com/vcpp/stl/call_with.asp
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.