2016-10-13 11 views
38

Mã này là từ C++ mồi p.446:Làm thế nào để hiểu hai cặp dấu ngoặc đơn trong đoạn mã này?

return hash<string>() (sd.isbn()); 

Tôi không hiểu các biểu hiện trở lại với hai cặp ngoặc đơn. Không có cú pháp tương tự ở phía trước của cuốn sách.

+1

Khó có thể nói mà không bối cảnh – Treycos

+2

Phụ thuộc vào những gì 'băm ()' trả về. Nếu nó trở về một lớp với một nhà điều hành cuộc gọi bị ghi đè, không có gì đặc biệt với điều đó. –

+2

Trong C++ 11 trở đi, bạn có thể sử dụng 'std :: hash {}' (tức là, niềng răng thay vì dấu ngoặc đơn) để xây dựng một đối tượng. Nó làm cho sự khác biệt giữa xây dựng đối tượng và các cuộc gọi hàm dễ dàng hơn. –

Trả lời

47

std::hash là loại lớp. Những gì bạn đang làm ở đây đang xây dựng tạm thời std::hash với hash<string>() và sau đó (sd.isbn()) gọi số operator() tạm thời chuyển qua số sd.isbn().

Nó sẽ giống như

std::hash<std::string> temp; 
return temp(sd.isbn()); 

Để đọc thêm về sử dụng các đối tượng có một see operator(): C++ Functors - and their uses

+1

Để thêm vào câu trả lời hay này. 'Temp (sd.isbn())' có vẻ khó hiểu ở đây vì nó là một đối tượng. Đối tượng cơ bản được sử dụng như một đối tượng hàm, một [functor] (http://stackoverflow.com/questions/356950/c-functors-and-their-uses). –

+0

@GillBates Cuộc gọi tốt. Đã thêm một liên kết trong câu trả lời. – NathanOliver

+2

Tôi sẽ xem xét một đối số tốt khác này cho việc khởi tạo ngoặc nhọn để làm rõ rằng bạn đang xây dựng một đối tượng, ví dụ: 'return hash {} (sd.isbn());' –

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