С C ++ 11 мы получаем лямбды и возможность создавать функции / функторы / замыкания на лету там, где они нам действительно нужны, а не там, где они на самом деле не принадлежат.
В C ++98/03, хороший способ создания функционально-локальных функторов / замыканий был бы следующим:
struct{
void operator()(int& item){ ++item; }
}foo_functor;
some_templated_func(some_args, foo_functor);
К сожалению, вы не можете использовать локальные типы для шаблонов (Visual Studio позволяет это с языкомрасширения включены).Тогда мой ход прошел следующим образом:
struct X{
static void functor(int& item){ ++item; }
};
some_templated_func(some_args, &X::functor);
Очевидная проблема заключается в том, что вы не можете сохранить любое состояние, поскольку локальные структуры / классы не могут иметь статических членов.
Мой следующийМы думали, что для решения этой проблемы было использовано сочетание std::bind1st
и std::mem_fun
и нестатических методов и переменных, но, к сожалению, std::mem_fun
почему-то задыхается от std::mem_fn(&X::functor)
, что опять-таки может быть из-за того, что локальная структура / классы не могут бытьиспользуется в шаблонах:
// wanted, not working solution
struct X{
int n_;
X(int n) : n_(n) {}
void functor(int& item) const { item += n_; }
};
X x(5);
some_templated_func(some_args,std::bind1st(std::mem_fun(&X::functor),&x));
Сбой в VC9 и VC10 (с /Za
, отключенные языковые расширения) со следующей ошибкой
error C2893: Failed to specialize function template 'std::const_mem_fun1_t<_Result,_Ty,_Arg> std::mem_fun(_Result (_Ty::* )(_Arg) const)'
With the following template arguments:
'void'
'main::X'
'int &'
или в gcc 4.3.4 с этой ошибкой
error: no matching function for call to ‘mem_fun(void (main()::X::*)(int&))’
Как ни странно, VC9 / VC10 по-прежнему задыхается в приведенном выше примере, даже с включенными языковыми расширениями:
error C2535: 'void std::binder1st<_Fn2>::operator ()(int &) const' : member function already defined or declared
Итак, функциональность, указанная в названии, так или иначе достижима?Или я делаю ошибку в последнем примере, как я использую std::bind1st
или std::mem_fun
?