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()));
Здравствуйте, Аноним, Вы писали:
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);
}
Здравствуйте, 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>
Работать может и будет, потому что нет виртуальных функций и производный класс не вводит доп. членов-данных, но скорее всего здесь "неопределенное поведение". Хотя в большинстве случаев работать видимо будет.
Здравствуйте, 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