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

Tôi hiểu std::tr1::reference_wrapper<int> và toàn bộ điều này là một số loại hàm con trỏ trả về void và mất int& làm đối số. Nhưng tôi dường như không thể theo dõi số *() ngay từ đầu. Mã được cắt dán từ một số phiên gdb tôi đã trải qua một thời gian trở lại.Loại trong mẫu này là gì?

Ngoài ra, loại hàm tr1 :: là gì? Một số hàm trả về void và không có đối số?

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

Nhưng rồi sau đây là một lỗi:

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

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

Trả lời

4

Đây là một thể hiện của std::tr1::_Bind instantiated vào loại một chức năng tham gia một std::tr1::reference_wrapper<int> và trả về một con trỏ tới một hàm lấy một tham chiếu đến int và trở về void.

Dưới đây là làm thế nào để đọc nó:

  • std::tr1::_Bind<loại> phải rõ ràng.
  • loại = void (fn)(int&) là một chức năng chụp int& và trở void.
  • fn = *ptr do đó, nó thực sự là một con trỏ đến hoạt
  • ptr = (FN2)(std::tr1::reference_wrapper<int>) là một chức năng chụp std::tr1::reference_wrapper<int> và những gì chúng tôi đã có cho đến nay là kiểu trả về của nó.
  • fn2 = (trống) vì chúng tôi không cung cấp cho chức năng (loại) đó một tên.

Tuy nhiên như bây giờ tôi nhận thấy khi FN2 là trống rỗng, ngoặc xung quanh nó nên có lẽ cũng không có mặt ở đó (tương tự như cách bạn viết các loại chức năng "chức năng chụp không có tham số và trả về khoảng trống" như void(), . không void()()

trường hợp trong std::tr1::function là chính xác rằng một: một chức năng chụp không có tham số và trả về void, với ngoặc thêm khoảng trống "tên hàm"

OK, bây giờ thử nghiệm nó:. gdb thực sự kết quả đầu ra void()void()(); điều này có lẽ nên được coi là một lỗi gdb.

Cách đúng để viết các loại đầu tiên trong C++ do đó là:

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

nên không phải là ngôi sao được giữa hai ngoặc cho điều đó? – 6502

+0

@ 6502: Không, bởi vì ngôi sao thuộc về * kiểu trả về * của hàm (chính nó là một hàm, và đối với hàm * * đó, ngôi sao thực sự nằm trong dấu ngoặc đơn tương ứng. – celtschk

+0

@ Fanatic23: Tôi đã trong quá trình viết điều đó lên. Nó chỉ mất một thời gian. – celtschk

Các vấn đề liên quan