Puntatore della variabile membro
-
21-12-2019 - |
Domanda
per una determinata struttura:
struct foo
{
void fooFunc(){}
int fooVar = 0;
};
.
Posso creare una chiamata Wapper alla funzione: std::mem_fn( &foo::fooFunc )
in modo tale da poterlo passare in un altro metodo e chiamarlo su un oggetto.
Voglio sapere se c'è un involucro di chiamata simile ma per le variabili dei membri.
Ad esempio Sto usando un puntatore in una variabile membro qui e ma vorrei usare un wrapper di chiamata:
void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
foo myFoo;
funcPtr( myFoo );
foo.*varPtr = 13;
}
. Soluzione
n.b.Nulla nella tua domanda è dallo STL (che è una biblioteca degli anni '90), generacodictagcode e std::function
fanno parte della libreria standard C ++, che non è la stessa cosa.
std::mem_fn
supporta funzioni dei membri e variabili dei membri, in modo da poter farlo solo per accedere alla variabile membro e impostarlo:
foo f;
std::function<int&(foo&)> var( std::mem_fn( &foo::fooVar ) );
var(f) = 1;
. Altri suggerimenti
Oltre alle funzioni dei membri, std::mem_fn
può avvolgere anche i membri dei dati e consentire l'accesso alle lezioni.Quindi i seguenti lavori:
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
.
Come jonathanwakely menziona nei commenti, è possibile utilizzare il tipo (non specificato) restituito da mem_fn
stesso per impostare il membro dei dati.
foo f;
std::mem_fn(&foo::fooVar)(f) = 13;
.
o per trasformarlo in un uso std::function
void bar( foo& f, std::function<int&(foo&)> fooVarSet )
{
fooVarSet(f) = 26;
}
.
Se tutto ciò che stai cercando è un modo per generare un chiamino per impostare il membro dei dati fooVar
e non usare std::mem_fn
specificamente per farlo, è possibile ottenere il lavoro anche eseguito utilizzando un'espressione di lambda.
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;});
.