boost user - ref

since: 2002-08-28 update: 2002-08-28 count:

サンプルコード。

こいつは、関数オブジェクトのヘルパに対して、 適切な型を教えるためのものです。 例えば、

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&lt;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 でも役に立ちますね。


home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h