Sự khác biệt giữa boost::ref(i)
và & i
là gì? Các tình huống mà chúng tôi không thể sử dụng tài liệu tham khảo thông thường là gì và phải thay mặt cho số boost::ref
? Vui lòng bao gồm các ví dụ nếu có thể.Sự khác biệt giữa boost :: ref và tham khảo thường xuyên
Trả lời
Mục đích của boost :: reference_wrapper là chứa một tham chiếu đến một đối tượng của loại T. Nó chủ yếu được sử dụng để "nuôi" tham khảo hoạt mẫu (thuật toán) lấy tham số theo giá trị.
NB: Một sự khác biệt quan trọng giữa boost::reference_wrapper
và std::reference_wrapper
(ít nhất là của Boost 1,52) là khả năng của std::reference_wrapper
để hoàn quấn đối tượng chức năng.
Điều này cho phép mã như thế này:
// functor that counts how often it was applied
struct counting_plus {
counting_plus() : applications(0) {}
int applications;
int operator()(const int& x, const int& y)
{ ++applications; return x + y; }
};
std::vector<int> x = {1, 2, 3}, y = {1, 2, 3}, result;
counting_plus f;
std::transform(begin(x), end(x), begin(y),
std::back_inserter(result), std::ref(f));
std::cout << "counting_plus has been applied " << f.applications
<< " times." << '\n';
Trong Boost.Thread ví dụ:
Một chủ đề mới được đưa ra bằng cách thông qua một đối tượng của một loại callable rằng có thể gọi không có tham số đến nhà xây dựng . Sau đó, đối tượng được sao chép vào bộ nhớ trong và được gọi trên luồng thực thi mới được tạo. Nếu đối tượng không được (hoặc không thể) được sao chép , sau đó tăng :: ref có thể được sử dụng để truyền tham chiếu đến đối tượng . Trong trường hợp này, người dùng của Boost.Thread phải đảm bảo rằng đối tượng được gọi là được gọi là out2ives luồng được thực hiện mới được tạo.
Mã từ doc:
struct callable
{
void operator()();
};
boost::thread copies_are_safe()
{
callable x;
return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OK
boost::thread oops()
{
callable x;
return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
// this leads to undefined behaviour
- 1. Sự khác biệt giữa 'const ref' và 'in'?
- 2. sự khác biệt giữa việc thực hiện curl_close() một lần hoặc thường xuyên?
- 3. Sự khác biệt giữa object_id và id thông thường
- 4. Sự khác biệt giữa $ .pluginName và $ .fn.pluginName
- 5. sự khác biệt giữa UINavigationController và UINavigationItem
- 6. "ref" loại từ khóa và tài liệu tham khảo
- 7. sự khác biệt giữa Interlocked.Exchange và Volatile.Write?
- 8. Sự khác biệt giữa $ (...) và `...`
- 9. Sự khác biệt giữa. và #
- 10. Sự khác biệt giữa $ * và $ @
- 11. Sự khác biệt giữa ". +" Và ". +?"
- 12. Sự khác biệt giữa "**/* /" và "** /"?
- 13. Sự khác biệt giữa = và: =
- 14. Sự khác biệt giữa const. con trỏ và tham chiếu?
- 15. Sự khác biệt giữa tham chiếu chuyển tiếp và *?
- 16. C++ 11 loại đặc điểm để phân biệt giữa lớp enum và enum thường xuyên
- 17. sự khác biệt giữa -lgcc_s và gcc
- 18. sự khác biệt giữa ARC và MRC
- 19. Sự khác biệt giữa add và addu
- 20. Sự khác biệt giữa @string và @ + string?
- 21. Sự khác biệt giữa WinMain và wWinMain
- 22. sự khác biệt giữa một con trỏ và tham số tham chiếu?
- 23. Sự khác biệt thực sự giữa "int" và "unsigned int"
- 24. sự khác biệt giữa ajax và gửi
- 25. Sự khác biệt giữa gấp và giảm?
- 26. Sự khác biệt giữa encodeURL và encodeRedirectURL
- 27. Sự khác biệt giữa $ .post và $ .ajax?
- 28. Sự khác biệt giữa Color.red và Color.RED
- 29. Sự khác biệt giữa Microsoft.Jet.OleDb và Microsoft.Ace.OleDb
- 30. Sự khác biệt giữa parseInt và valueOf trong java?
@Venkat Shiva: Tình hình là "Khi các thuật toán cần phải thực hiện thông số của họ bằng giá trị" và bạn không muốn phải chịu hình phạt thực hiện thông qua một đối tượng theo giá trị . –
Tôi đoán tôi nên đọc tài liệu chính xác trước khi đăng câu hỏi. Xin lỗi vì những rắc rối. –