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

entiendo std::tr1::reference_wrapper<int> y todo esto es una especie de puntero de función que devuelve void y toma int& como argumento. Pero al parecer no puedo seguir el *() al principio. El código está cortado y pegado de alguna sesión de gdb que estaba atravesando hace un tiempo.¿Cuál es el tipo en esta plantilla?

Además, ¿cuál es el tipo de función tr1 ::? ¿Alguna función que devuelve vacío y no toma ningún argumento?

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

Pero entonces el siguiente es un error:

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

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

Respuesta

4

Esta es una instancia de std::tr1::_Bind una instancia del tipo de una función que toma un std::tr1::reference_wrapper<int> y devolver un puntero a una función que toma una referencia a int y volviendo vacío.

Así es como para leerlo:

  • std::tr1::_Bind<tipo> debe ser clara.
  • tipo = void (fn)(int&) es una función de tomar int& y volviendo void.
  • fn =*ptr por lo que es en realidad un puntero a funcionar
  • ptr = (na2)(std::tr1::reference_wrapper<int>) es una función de tomar std::tr1::reference_wrapper<int> y lo que teníamos hasta ahora es su tipo de retorno.
  • fn2 = (vacío) porque no le damos a esa función (escriba) un nombre.

Sin embargo ya que ahora cuenta cuando el na2 está vacía, los paréntesis alrededor de ella debe probablemente también no estar allí (similar a la forma de escribir la "función sin parámetros y devolver vacío" tipo de función que void(), . no void()()

el caso en std::tr1::function es exactamente que uno: una función sin parámetros y devolver void, con paréntesis adicionales alrededor del "nombre de la función" vacío

bien, ahora lo probó:. gDB hecho salidas void() como void()(); esto probablemente debería considerarse un error gdb.

La forma correcta de escribir el primer tipo en C++ por lo tanto, es:

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

¿No debería ser la estrella entre los dos paréntesis para que? – 6502

+0

@ 6502: No, porque la estrella pertenece al * tipo de retorno * de la función (que a su vez es una función, y para la función * that * la estrella está de hecho dentro de los paréntesis correspondientes. – celtschk

+0

@ Fanatic23: Ya estaba en el proceso de escribir eso. Solo tomó algo de tiempo. – celtschk

Cuestiones relacionadas