Frage

Für eine gegebene Struktur:

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

Ich kann einen Aufruf-Wapper für die Funktion erstellen: std::mem_fn( &foo::fooFunc ) so dass ich es an eine andere Methode übergeben und für ein Objekt aufrufen kann.
Ich möchte wissen, ob es einen ähnlichen Aufruf-Wrapper gibt, aber für Mitgliedsvariablen.

Zum Beispiel verwende ich hier einen Zeiger auf eine Mitgliedsvariable und möchte aber einen Aufruf-Wrapper verwenden:

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

Lösung

n.b.Nichts in Ihrer Frage stammt aus der STL (ein Bibliothek aus den 1990er Jahren), std::function und std::mem_fn sind Teil der C ++ - Standardbibliothek, die nicht dasselbe ist.

std::mem_fn unterstützt Elementfunktionen und Mitgliedsvariablen, sodass Sie dies einfach tun können, um auf die Member-Variable zuzugreifen, und legen Sie sie ein:

generasacodicetagpre.

Andere Tipps

Zusätzlich zu den Mitgliederfunktionen, std::mem_fn kann auch Datenelemente umschließen und Lesezugriff auf sie zulassen.Also das Folgende funktioniert:

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

Wie JonathanWakely in den Kommentaren erwähnt, können Sie den (nicht angegebenen) Typ verwenden, der von zurückgegeben wird mem_fn selbst, um das Datenelement festzulegen.

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

Oder um es in eine zu verwandeln std::function verwenden

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

Wenn Sie nur nach einer Möglichkeit suchen, ein Callable zu generieren, um das zu setzen fooVar datenelement und nicht verwenden std::mem_fn speziell zu diesem Zweck können Sie die Arbeit auch mit einem Lambda-Ausdruck erledigen.

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

Live-Vorführung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top