Membre De La Variable Pointeur
-
21-12-2019 - |
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;
}
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;});