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

std::tr1::reference_wrapper<int>'u anlıyorum ve bu her şey void döndüren ve argüman olarak int& değerini alan bir tür işlev göstericisidir. Ancak, başlangıçta *()'u takip edemiyorum. Kod, bir gdb oturumundan kesilmiş bir geçmişten geçiyordu.Bu şablondaki tip nedir?

Ayrıca, tr1 :: işlevinin türü nedir? Bazı işlev geçersiz olan ve hiçbir argüman almayan?

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

Ancak aşağıdaki bir hatadır: Bu int bir referans alınarak bir işlev için bir işaretçi, bir std::tr1::reference_wrapper<int> ve dönüş fonksiyonu türüne örneği std::tr1::_Bind bir örneğidir

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

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

cevap

4

ve geri dönüşsüz.

İşte okumak için:

  • std::tr1::_Bind<tip> açık olmalıdır.
  • tip = void ()(int&) fn bir fonksiyonu int& alarak ve void kardır. = *ptr fn
  • yüzden
  • ptr = (fn2)(std::tr1::reference_wrapper<int>)std::tr1::reference_wrapper<int> alarak bir işlevdir çalışması için aslında bir işaretçi var ve ne kadar vardı şimdi dönüş türüdür etmek.
  • fn2 = (boş), çünkü bu işlevi (ad) bir ad vermeyiz. fn2 boş olduğunda ben şimdi fark olarak

Ancak, onun etrafında parantez muhtemelen de, (orada fonksiyon tipi "işlevini hiçbir parametre alarak ve hükümsüz dönen" void() olarak yazmaya benzer olmamalı . not void()()

std::tr1::function durum tam olarak bu biridir: bir fonksiyon boş "fonksiyonu adı" etrafında ekstra parantez ile, herhangi bir parametre alıp void dönen

Tamam, şimdi test:. gdb gerçektençıkarır, void()(); Bu muhtemelen bir gdb hatası olarak görülmelidir.

nedenle C++ ilk türünü doğru yazmanın yoludur:

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

yıldız bunun için iki parantez arasında olması gerekmez mi? – 6502

+0

@ 6502: Hayır, çünkü yıldız, işlevin * dönüş türüne * aittir (kendisinin bir işlevidir ve * için * bu yıldızın işlevi aslında karşılık gelen parantez içinde yer alır. – celtschk

+0

@ Fanatic23: Yazma sürecindeydim. Sadece biraz zaman aldı. – celtschk