web-dev-qa-db-ja.com

ファクトリー:一時的なスマートポインターを関数に渡す方法。 C ++

クラスFooがあります

class Foo;

ポインタを返すファクトリ:

std::unique_ptr<Foo> createFoo(); 

そして、私は Herb からFooの寿命について特別な主張のない単純な関数は単純な裸のポインタを取るべきだと言われたので:

void plainf(Foo* f);

私のクライアントはこれをどのように正しく行うべきですか?

plainF(createFoo());

彼が書く必要がある場合、彼は幸せではないだろう:

auto someName = createFoo();
plainF(someName.get()); 
23
jimifiki

get メンバー関数を使用して、所有オブジェクトへの生のポインターを返すことができます。

_plainF(createFoo().get());
_

createFoo()によって作成された一時は、plainFが終了するまでスコープ外になりません。 plainFがスコープ外にポインタを渡さない限り、これは完全に安全です。

39
NathanOliver

plainFへの引数をNULL可能にする必要がない場合は、参照によって引数を取るように署名を変更して、少し冗長な構文を許可することもできます。

std::unique_ptr<Foo> createFoo(); 
void plainf(Foo& f);

plainF(*createFoo());

NathanOliver's answer に記載されているすべてのライフタイムに関する考慮事項が適用されるため、これは安全に使用できます。

これは、createFooが空のunique_ptr。そのため、その機能が失敗することが許可されている場合、他の手段、たとえば、例外をスローします。

21
ComicSansMS