web-dev-qa-db-ja.com

C ++ std :: unique_ptrは関数から戻り、nullをテストします

クラスmyClassのオブジェクトへのポインターを返す必要がある関数があります。この目的のために、std::unique_ptrを使用しています。

関数が成功した場合、データを持つオブジェクトへのポインターを返します。失敗した場合、nullを返します。

これは私のコードの骨格です:

std::unique_ptr<myClass> getData()
{
   if (dataExists)
      ... create a new myClass object, populate and return it ...

   // No data found
   return std::unique_ptr<myClass> (null); <--- Possible ?
}

mainで:

main()
{
   std::unique_ptr<myClass> returnedData;

   returnedData = getData();

   if (returnedData != null)   <-- How to test for null ?
   {
      cout << "No data returned." << endl;
      return 0;
   }

   // Process data
}

だからここに私の質問があります:

a)(オブジェクトまたはnullを返す)それはstd::unique_ptrを使用して実行できますか?

b)可能であれば、実装方法は?

c)不可能な場合、代替手段はありますか?

手伝ってくれてありがとう。

21
Mendes

次のいずれかが機能するはずです。

return std::unique_ptr<myClass>{};
return std::unique_ptr<myClass>(nullptr);

返されたオブジェクトが有効なオブジェクトを指しているかどうかをテストするには、単に次を使用します。

if ( returnedData )
{
   // ...
}

http://en.cppreference.com/w/cpp/memory/unique_ptr/operator_bool を参照してください。

33
R Sahu

はい、可能です。デフォルトで構築された unique_ptr はあなたが望むものです:

何も所有しないstd::unique_ptrを構築します。

// No data found
return std::unique_ptr<myClass>{};

これはnullptr_tコンストラクターと同等であるため、おそらくこれはより明確です。

// No data found
return nullptr;
8
Barry

はい、可能です。デフォルトで構築されたunique_ptrまたはnullptrから構築されたものはnullとみなすことができます:

std::unique_ptr<MyClass> getData()
{
    if (dataExists)
        return std::make_unique<MyClass>();
    return nullptr;
}

Nullをテストするには、nullptrと比較するか、boolへの変換を利用します。

int main()
{
    std::unique_ptr<MyClass> returnedData = getData();

    if (returnedData)
    {
        ... 
    }
}
4
Chris Drew

最新のC++ライブラリでは、make_unique_に_<memory>_関数があり、C++ 11ライブラリで_unique_ptr_および共有ポインタを使用して、_make_shared_を簡単に作成できます。 。

したがって、std::make_unique(nullptr)を返すことでコードを少し解明できます。

さらに、C++の次のバージョンでは、some値またはnone値のいずれかとして評価される「オプション」タイプがあります。空のunique_ptrがnullptrのように扱われる可能性があるのとは異なり、none値は有効な値として扱われることはできません。オプションタイプは、標準ライブラリに入るBoostのさらに別の部分を表します。

1