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

È stato utile?

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

demo live

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top