こいつは、関数オブジェクトのヘルパに対して、 適切な型を教えるためのものです。 例えば、
template <class T_> class Class { public: explicit Class(T_ id) : id_(id) {} Class(const Class& rhs) : id_(rhs.id_) {} void operator()() { std::cout << ++id_ << std::endl; } private: T_ id_; };
という関数オブジェクトがあったら、 そのヘルパ、
template <class T_> Class<T_> make_Class(T_ id) { return Class<T_>(id); }
は、誰でも作りたくなるでしょう。 これで、クライアントコードで明示的に型を教える必要が無くなったのです。
make_Class(0)(); make_Class("a")();
てな具合です。 しかし、この方法は、参照を渡したくなった時に困ることになります。 参照渡しと値渡しは関数呼び出しでは区別がつかないので、 常に値渡しとなってしまいます。 まあ、参照で渡したい時は明示的に指定するか、 コンストラクタを自分で呼ぶかするのが普通です。
make_Class<const std::string&>("big string")(); Class<const std::string&>("big string")();
てなもんです。 しかし、この程度の例なら良いですが、 例えば前述の bind は、非常にテンプレート引数が多くなることがあり、 その指定が非常に面倒です。
そこで、引数の側でこれは参照であるのだぞ、と伝えることになります。 そのために用意されたのが boost::ref です。 boost::ref を使うと前述のコードは、
make_Class(boost::cref("big string"))();
と、なります。ああ、cref は const ref です。
std::make_pair や boost::make_tuple でも役に立ちますね。
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。