2010-04-01 20 views

Trả lời

7

Từ Boost.Ref Documentation:

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_wrapperstd::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'; 
+0

@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ị . –

+0

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. –

4

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 
Các vấn đề liên quan