2008-10-11 7 views
17

최근 Scott Meyers의 우수 Effective C++ 도서를 통해 읽었습니다. 마지막 팁 중 하나에서 그는 TR1의 기능 중 일부를 다뤘습니다. Boost를 통해 그 중 많은 기능을 알았습니다.tr1 :: reference_wrapper는 어떻게 유용합니까?

그러나 tr1 :: reference_wrapper를 확실히 알지 못했습니다.

언제 어떻게 tr1 :: reference_wrapper를 사용할 수 있습니까?

답변

16

내가 아는 한 boost :: ref와 같습니다. 기본적으로 복사 할 수있는 참조입니다. 참조로 매개 변수를 전달해야하는 함수에 바인딩 할 때 매우 유용합니다. 예 (부스트 구문을 사용하여)에 대한

:

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

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

fIncrementMyVariable(); 

This Dr. Dobbs article는 약간의 정보가 있습니다.

희망이 있으며 유용합니다. :)

+0

좋습니다. 나는 boost :: ref에 익숙하다. TR1이이 기능을 다른 것으로 불렀다는 것을 깨닫지 못했다. 즉, tr1 :: ref가 아니다. – paxos1977

+2

@ceretullis ref는 reference_wrapper 개체를 생성하는 생성자 메서드입니다. 여기서 T는 형식입니다. –

+0

with C++ 11, 나는 람다를 사용하는 것을 선호한다고 생각한다 :'auto fIncrement = [& iVariable] {Increment (iVariable);};' –

11

reference_wrapper<T>은 매우 유용하고 간단한 라이브러리입니다. 내부적으로 reference_wrapper<T>은 T에 대한 포인터를 저장하지만 그것이 노출하는 인터페이스는 포인터 표기법을 포함하지 않습니다.

  • 참조가 다른 간단한 개체처럼 동작하도록 허용합니다. reference_wrapper<T>을 STL 컨테이너에 저장할 수 있습니다.
  • 너무 많은 세그멘테이션 오류의 원인 인 두려운 포인터 표기법을 피하는 데 도움이됩니다. reference_wrapper<T>, 참조 포인터 및 T->f()T.f() (가능하면 힙 할당 객체를 삭제하기 위해 포인터를 저장해야하지만 메모리 관리를 위해서는 Boost 포인터 컨테이너가 유용합니다)로 T에 대한 포인터를 대체하십시오.

예 : 나는 참조 래퍼의 부스트 구현을 사용했지만, C++ 0X 표준도를해야 할 것입니다 여기에

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; 
} 

. 또한 http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-ref

+1

"old"문법은 다음과 같다 : [A * a_; boost :: reference_wrapper와 비교하면 a_;] 및 [a_ = & a; a_ = boost :: ref (a);]와 비교 [return * a_; (A & a) : a _ (& a) {}]와 비교하여 B (A & a) –

관련 문제