2008-10-11 31 views
17

gần đây tôi đã đọc qua cuốn sách tuyệt vời của Scott Meyers Effective C++. Trong một trong những lời khuyên cuối cùng, ông đã giới thiệu một số tính năng từ TR1 - tôi biết nhiều người trong số họ thông qua Boost.Tr1 :: reference_wrapper hữu ích như thế nào?

Tuy nhiên, có một điều mà tôi chắc chắn KHÔNG nhận ra: tr1 :: reference_wrapper.

Tôi sẽ sử dụng tr1 :: reference_wrapper như thế nào và khi nào?

Trả lời

16

Giống như tăng :: ref, theo như tôi biết. Về cơ bản, một tham chiếu có thể được sao chép. Rất hữu ích khi liên kết với các chức năng mà bạn cần truyền tham số bằng tham chiếu.

Ví dụ (sử dụng cú pháp tăng):

void Increment(int& iValue) 
{ 
    iValue++; 
} 

int iVariable = 0; 
boost::function< void() > fIncrementMyVariable = boost::bind(&Increment, boost::ref(iVariable)); 

fIncrementMyVariable(); 

This Dr. Dobbs article có một số thông tin.

Hy vọng điều này là đúng và hữu ích. :)

+0

Được rồi, tuyệt. Tôi quen thuộc với tăng :: ref ... Tôi chỉ không nhận ra TR1 được gọi là chức năng này một cái gì đó khác nhau - tức là, không tr1 :: ref. – paxos1977

+2

@ceretullis ref là phương thức khởi tạo để tạo ra một đối tượng reference_wrapper , trong đó T là một kiểu. –

+0

với C++ 11, tôi nghĩ tôi thích sử dụng lambda: 'auto fIncrement = [& iVariable] {Increment (iVariable);}; ' –

11

reference_wrapper<T> là một thư viện vô cùng hữu ích và đơn giản. Nội bộ các reference_wrapper<T> lưu trữ một con trỏ đến T. Nhưng giao diện nó lộ ra không chứa bất kỳ ký hiệu con trỏ nào.

  • Cho phép tham chiếu hoạt động như các đối tượng đơn giản khác - reference_wrapper<T> có thể được lưu trữ trong vùng chứa STL.
  • Giúp tránh ký hiệu con trỏ đáng sợ - nguyên nhân gây ra nhiều lỗi phân đoạn. Thay thế con trỏ đến T bằng reference_wrapper<T>, con trỏ theo tham chiếu và T->f() bởi T.f() bất cứ nơi nào có thể (con trỏ ofcourse cần được lưu trữ để xóa đối tượng phân bổ heap, nhưng để quản lý bộ nhớ Tăng con trỏ Container khá hữu ích).

Ví dụ:

class A 
{ 
    //... 
}; 

class B 
{ 
public: 
    void setA(A& a) 
    { 
    a_ = boost::ref(a); // use boost::cref if using/storing const A& 
    } 
    A& getA() 
    { 
     return a_; 
    } 
    B(A& a): a_(a) {} 
private: 
    boost::reference_wrapper<A> a_; 
}; 

int main() 
{ 
    A a1; 
    B b(a1); 
    A a2; 
    b.setA(a2); 
    return 0; 
} 

Ở đây tôi đã sử dụng thực hiện tăng của wrapper tham khảo, nhưng tiêu chuẩn C++ 0x đang xảy ra để có nó quá. Xem thêm http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-ref

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