Вопрос

для данной структуры:

struct foo
{
    void fooFunc(){}
    int fooVar = 0;
};
.

Я могу создать вызов WAPPER к функции: std::mem_fn( &foo::fooFunc ) такой, что я могу передать его в другой метод и вызвать его на объекте.
Я хочу знать, если есть аналогичная оболочка звонка, но для переменных элементов.

Например, я использую указатель на переменную элемента здесь и но я хотел бы использовать обертку вызова:

void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
    foo myFoo;
    funcPtr( myFoo );
    foo.*varPtr = 13;
}
.

Это было полезно?

Решение

N.B.Ничто в вашем вопросе не имеет STL (которая является библиотекой из 1990-х годов), std::function и std::mem_fn являются частью стандартной библиотеки C ++, которая не то же самое.

std::mem_fn поддерживает функции элементов и переменные элементов, поэтому вы можете просто сделать это, чтобы получить доступ к переменной элементами и установить его:

foo f;
std::function<int&(foo&)> var( std::mem_fn( &foo::fooVar ) );
var(f) = 1;
.

Другие советы

В дополнение к функциям-членам, 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
.

Как jonathanwakeely упоминает в комментариях, вы можете использовать тип (не определенный) тип, возвращенный самим mem_fn для установки элемента данных.

foo f;
std::mem_fn(&foo::fooVar)(f) = 13;
.

или чтобы преобразовать его в воспитательно использовать использование

void bar( foo& f, std::function<int&(foo&)> fooVarSet )
{
    fooVarSet(f) = 26;
}
.

Если все, что вы ищете, это способ создания Callable для установки элемента данных std::function, а не использование fooVar специально для этого, вы также можете получить задание, выполненную с использованием выражения лямбда.

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;});
.

Живая демонстрация

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top