В дополнение к функциям-членам std::mem_fn
также может обертывать элементы данных и разрешать доступ к ним для чтения. Итак, работает следующее:
void print_fooVar(foo& f, std::function<int(foo)> varAccess)
{
std::cout << varAccess(f) << std::endl;
}
foo f;
print_fooVar(f, std::mem_fn(&foo::fooVar)); // prints 0
Как упоминает Джонатан Уэйкли в комментариях, вы можете использовать (неуказанный) тип, возвращаемый самим mem_fn
, для установки члена данных.
foo f;
std::mem_fn(&foo::fooVar)(f) = 13;
Или превратить его в std::function
использование
void bar( foo& f, std::function<int&(foo&)> fooVarSet )
{
fooVarSet(f) = 26;
}
Если все, что вам нужно, это способ сгенерировать вызываемый объект для установки члена данных fooVar
, а не использовать std::mem_fn
специально для этого, вы также можете выполнить эту работу с помощью лямбда-выражения.
void bar( foo& f, std::function<void(foo)> funcPtr,
std::function<void(foo&, int)> fooVarSet )
{
funcPtr( f );
fooVarSet(f, 13);
}
foo f;
bar(f, std::mem_fn(&foo::fooFunc), [](foo& f, int i) {f.fooVar = i;});
Текущая демонстрация
person
Praetorian
schedule
04.06.2014
mem_fn
, и указатель на член дляint foo::*
. - person Jonathan Wakely   schedule 04.06.2014