私はこのようなものがあります:C++:参照や工場
struct D {
virtual void operator() {...};
}
struct D1 : public D {
virtual void operator() {...};
}
struct D2 : public D {
virtual void operator() {...};
}
void foo(D &d) {...};
をだから、これは結構です、とうまく私のD'sののライフサイクルを制御します
foo(D());
foo(D1());
foo(D2());
しかし、私は私のDバリアントを選択してください複数の場所で、私は単純な工場が欲しい:
const D& make_D()
{
// BAD, returning reference to temporary
if(is_tuesday())
return D1();
return D2();
}
一時的な参照を返す代わりに、私はオブジェクトを返すことができますct、しかし私は基本クラスにスライスします。あるいは、工場からポインタを返すこともできますが、クライアントはそれを削除する必要があります。他のより複雑なソリューションでも、クライアントに負荷がかかります。
D& d = make_D();
foo(d);
(あるいはfoo(make_D())
)のようなものを書くための方法はありますか?目的はさまざまなDの定義とmake_D()
の複雑さを包み込んで、foo()
のような関数とそれらの関数を呼び出す関数がそれを心配する必要がないようにすることです。
注意:非const値のリファレンスにテンポラリをバインドすることはできないため、 'foo(D())'はコンパイルされません(適合するコンパイラの下ではなく、 。 –