Question

Pour une struct:

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

Je peux créer un appel wapper à la fonction: std::mem_fn( &foo::fooFunc ) tel que je peux le passer à une autre méthode et de l'appeler sur un objet.
Je veux savoir si il y a un appel similaire wrapper, mais pour les variables de membre.

Je vais par exemple à l'aide d'un pointeur vers une variable de membre ici et la, mais je voudrais utiliser un appel wrapper:

void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
    foo myFoo;
    funcPtr( myFoo );
    foo.*varPtr = 13;
}
Était-ce utile?

La solution

N. B.Rien dans votre question, c'est de la STL (qui est une bibliothèque à partir des années 1990), std::function et std::mem_fn font partie de la Norme C++ de la Bibliothèque, ce qui n'est pas la même chose.

std::mem_fn prend en charge des fonctions de membre et de membre de variables, de sorte que vous pouvez faire pour accéder à la variable de membre et de le définir:

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

Autres conseils

En plus des fonctions de membre, std::mem_fn peut encapsuler des données membres, et autoriser l'accès en lecture à eux.Donc, les ouvrages suivants:

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

Comme JonathanWakely mentionne dans les commentaires, vous pouvez utiliser le (non spécifiés) type retourné par mem_fn de fixer lui-même le membre de données.

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

Ou de le transformer en un std::function utilisation

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

Si vous êtes à la recherche d'un moyen pour générer un callable pour définir le fooVar membre de données, et non pas à l'aide de std::mem_fn spécifiquement pour ce faire, vous pouvez obtenir le travail fait à l'aide d'une expression lambda ainsi.

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

Démonstration en direct

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top