2012-04-15 18 views
6
std::tr1::_Bind<void (*()(std::tr1::reference_wrapper<int>))(int&)> 

Ich verstehe std::tr1::reference_wrapper<int> und das Ganze ist eine Art von Funktionszeiger, die void und nimmt int& als Argument zurückzugibt. Aber ich kann nicht scheinen, die *() am Anfang zu folgen. Der Code wurde aus einer gdb-Sitzung herausgeschnitten, die ich vor einiger Zeit durchging.Was ist der Typ in dieser Vorlage?

Auch, was ist der Typ zu tr1 :: Funktion? Eine Funktion, die void zurückgibt und kein Argument benötigt?

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

aber dann die folgende ist ein Fehler:

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

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

Antwort

4

Dies ist ein Beispiel von std::tr1::_Bind von der Art der Funktion instanziiert ein std::tr1::reference_wrapper<int> und Zurückkehren einen Zeiger auf eine Funktion, wobei eine Referenz genommen auf int und die Leere zurückgeben.

Hier ist, wie es zu lesen:

  • std::tr1::_Bind<Typ> sollte klar sein.
  • Typ = void (fn)(int&) ist eine Funktion int& und Rückkehr void nehmen.
  • fn = *ptr so ist es tatsächlich ein Zeiger
  • ptr = (fn2)(std::tr1::reference_wrapper<int>) eine Funktion Funktion ist std::tr1::reference_wrapper<int> nehmen und was hatten wir bis jetzt ist sein Rückgabetyp.
  • fn2 = (leer), weil wir dieser Funktion (Typ) keinen Namen geben.

jedoch, wie ich jetzt feststellen, wenn die fn2 leer ist, sollten die Klammern um es wohl auch nicht, dass es (ähnlich wie Sie den Funktionstyp „Funktion keine Parameter zu nehmen und void zurückgibt“, wie void() schreiben, . void()() nicht

der Fall in std::tr1::function ist genau, dass man: eine Funktion keine Parameter zu nehmen und void, mit zusätzlichen Klammern um den leeren „Funktionsnamen“ Rückkehr

OK, jetzt getestet. gDB in der Tat gibt void() als void()(); Dies sollte wahrscheinlich als ein gdb-Fehler betrachtet werden.

Der richtige Weg, um den ersten Typ in C++ daher zu schreiben ist:

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

Sollte der Stern nicht, dass zwischen den beiden Klammern sein? – 6502

+0

@ 6502: Nein, weil der Stern zum * Rückgabetyp * der Funktion gehört (der selbst eine Funktion ist, und für * diese * Funktion steht der Stern tatsächlich innerhalb der entsprechenden Klammern. – celtschk

+0

@ Fanatic23: Ich war bereits dabei, das zu schreiben. Es hat nur etwas gedauert. – celtschk