最近、Scott Meyers の『 Effective C++ 』という素晴らしい本を読んでいます。最後のヒントの 1 つで、彼は TR1 の機能のいくつかを取り上げました。私はそれらの多くを Boost で知っていました。
ただし、私がまったく認識していないものがありました: tr1::reference_wrapper.
tr1::reference_wrapper をいつ、どのように使用しますか?
最近、Scott Meyers の『 Effective C++ 』という素晴らしい本を読んでいます。最後のヒントの 1 つで、彼は TR1 の機能のいくつかを取り上げました。私はそれらの多くを Boost で知っていました。
ただし、私がまったく認識していないものがありました: tr1::reference_wrapper.
tr1::reference_wrapper をいつ、どのように使用しますか?
私の知る限り、これはboost::refのようなものです。基本的に、コピーできる参照。参照によってパラメーターを渡す必要がある関数にバインドする場合に非常に便利です。
例 (boost 構文を使用):
void Increment( int& iValue )
{
iValue++;
}
int iVariable = 0;
boost::function< void () > fIncrementMyVariable = boost::bind( &Increment, boost::ref( iVariable ));
fIncrementMyVariable();
このドブス博士の記事には、いくつかの情報があります。
これが正しく、役立つことを願っています。:)
reference_wrapper<T>
非常に便利でシンプルなライブラリです。内部的にはreference_wrapper<T>
Tへのポインタを格納します。ただし、公開するインターフェイスにはポインタ表記は含まれていません。
reference_wrapper<T>
ことができます。aはSTLコンテナに格納できます。reference_wrapper<T>
もちろん、ヒープに割り当てられたオブジェクトを削除するためにポインタを格納する必要がありますが、メモリ管理にはBoost Pointer Containersが非常に役立ちます)。T->f()
T.f()
例:
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;
}
ここでは、参照ラッパーのブースト実装を使用しましたが、C++0x標準にもそれがあります。http://aszt.inf.elte.hu/~gsd/halado_cpp/ch11.html#Bind-refも参照してください。