6 Stimmen

Was ist der Typ in dieser Vorlage?

std::tr1::_Bind<void (*()(std::tr1::reference_wrapper<int>))(int&)>

Ich verstehe std::tr1::reference_wrapper<int> und diese ganze Sache ist eine Art Funktionszeiger, der void und nimmt int& als Argument. Aber ich kann den Anweisungen nicht folgen. *() am Anfang. Der Code ist von einigen gdb-Sitzung, die ich durch eine Weile zurück ging eingefügt.

Außerdem, was ist der Typ von tr1::function? Eine Funktion, die void zurückgibt und kein Argument annimmt?

0x00000001000021a1 in std::tr1::function<void ()()>::operator() (this=0x7fff5fbffb98) at functional_iterate.h:865

Aber dann ist das Folgende ein Fehler:

template <typename T>
void f()
{ 
  cout << "general\n";
}

template<>
void f<void ()()> () // this is error
{
  cout << "specific\n";
}

4voto

celtschk Punkte 18621

Dies ist ein Beispiel für std::tr1::_Bind instanziiert auf den Typ einer Funktion, die eine std::tr1::reference_wrapper<int> und Rückgabe eines Zeigers auf eine Funktion, die einen Verweis auf int annimmt und void zurückgibt.

So lesen Sie ihn:

  • std::tr1::_Bind< Typ > sollte klar sein.
  • Typ \= void ( fn )(int&) ist eine Funktion, die int& und die Rückkehr void .
  • fn \= * ptr ist also eigentlich ein Zeiger auf die Funktion
  • ptr \= ( fn2 )(std::tr1::reference_wrapper<int>) ist eine Funktion, die std::tr1::reference_wrapper<int> und was wir bisher hatten, ist sein Rückgabetyp.
  • fn2 \= (leer), weil wir dieser Funktion (Typ) keinen Namen geben.

Doch wie ich jetzt feststelle, wenn die fn2 leer ist, sollten die Klammern um ihn herum wahrscheinlich auch nicht vorhanden sein (ähnlich wie man den Funktionstyp "function taking no parameters and returning void" als void() , nicht void()() .

Der Fall in std::tr1::function ist genau das: Eine Funktion, die keine Parameter benötigt und Folgendes zurückgibt void , mit zusätzlichen Klammern um den leeren "Funktionsnamen".

OK, jetzt getestet: gdb gibt tatsächlich aus void() als void()() Dies sollte wahrscheinlich als GDB-Fehler betrachtet werden.

Die korrekte Art und Weise, den ersten Typ in C++ zu schreiben, ist daher:

std::tr1::_Bind<void (*(std::tr1::reference_wrapper<int>))(int&)>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X