foo
クラスに2つのカスタムコンストラクタがあるとします(例:foo::foo(bar const &)
とfoo::foo(baz const &)
)。いくつかの条件に応じていずれかを呼び出すための良いスタイルとは何でしょうか。たとえば:コンストラクタの条件付き呼び出し
bar a;
baz b;
foo my_foo;
if (...) {
my_foo = foo(a);
} else {
my_foo = foo(b);
}
は、時間(とメモリ)の作成上の(削除)(私は考えている具体的な場合には非常に賢明ではありません)と、本質的に無駄にされているデフォルトの構築可能であることをfoo
を必要としますデフォルトで構築された一時オブジェクト。スコープのために、my_foo
をifブロックまたはelseブロック内に宣言することはできません。
代わりに、ポインタを使用してnew
で構成することもできます。これは、効率が悪い(間接、ヒープ割り当て)、潜在的に安全でない(保証ポインタがぶら下がりしていない; delete
にする必要がありますが、後者はstd::unique_ptr
を使用して処理できます)。
foo my_foo = (...) ? foo(a) : foo(b);
三項演算子は、網羅的であることが保証ので、スコープが問題ではありませんので、動作します。
は、私はそれを行うための一つの方法を発見しました。私は三項演算子の大ファンではなく、条件子ブロックでいくつかの処理を行いたい場合があります。伝統的なif-else構文で同じことを達成するためのエレガントな方法はありますか?
を使用することができます。もしあなたが本当に見た目を気にしていれば、関数やラムダで物を包むことができます。 –
これは、ポインタ、ヌル可能型、または移動可能な型と、オブジェクトインスタンスを返す関数(ラムダを含む、優れた答えを参照)で行うことができます。デフォルトコンストラクタは必要ありません。 –