최근 Scott Meyers의 우수 Effective C++ 도서를 통해 읽었습니다. 마지막 팁 중 하나에서 그는 TR1의 기능 중 일부를 다뤘습니다. Boost를 통해 그 중 많은 기능을 알았습니다.tr1 :: reference_wrapper는 어떻게 유용합니까?
그러나 tr1 :: reference_wrapper를 확실히 알지 못했습니다.
언제 어떻게 tr1 :: reference_wrapper를 사용할 수 있습니까?
최근 Scott Meyers의 우수 Effective C++ 도서를 통해 읽었습니다. 마지막 팁 중 하나에서 그는 TR1의 기능 중 일부를 다뤘습니다. Boost를 통해 그 중 많은 기능을 알았습니다.tr1 :: reference_wrapper는 어떻게 유용합니까?
그러나 tr1 :: reference_wrapper를 확실히 알지 못했습니다.
언제 어떻게 tr1 :: reference_wrapper를 사용할 수 있습니까?
내가 아는 한 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는 약간의 정보가 있습니다.
희망이 있으며 유용합니다. :)
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
"old"문법은 다음과 같다 : [A * a_; boost :: reference_wrapper와 비교하면 a_;] 및 [a_ = & a; a_ = boost :: ref (a);]와 비교 [return * a_; (A & a) : a _ (& a) {}]와 비교하여 B (A & a) –
좋습니다. 나는 boost :: ref에 익숙하다. TR1이이 기능을 다른 것으로 불렀다는 것을 깨닫지 못했다. 즉, tr1 :: ref가 아니다. – paxos1977
@ceretullis ref는 reference_wrapper 개체를 생성하는 생성자 메서드입니다. 여기서 T는 형식입니다. –
with C++ 11, 나는 람다를 사용하는 것을 선호한다고 생각한다 :'auto fIncrement = [& iVariable] {Increment (iVariable);};' –