「C++の基礎 - 構造体」の版間の差分

ナビゲーションに移動 検索に移動
253行目: 253行目:
  if (stat("example.txt", &file_info) == 0) {
  if (stat("example.txt", &file_info) == 0) {
     // file_infoを使ってファイル情報にアクセス
     // file_infoを使ってファイル情報にアクセス
}
</syntaxhighlight>
<br><br>
== nullptrの代替 ==
<code>std::optional</code>を使用することにより、<code>nullptr</code>のような振る舞いを実現することができる。<br>
<u>ただし、C++17以降で利用可能である。</u><br>
<br>
この記述は、以下に示すようなメリットがある。<br>
* 関数が値を持っているかどうかを明示的に示すことができる。
* 呼び出し側において、値の存在を確認した後に使用することを強制することができる。
<br>
<syntaxhighlight lang="c++">
#include <optional>
struct HOGE {
    int        i;
    double      f;
    bool        b;
    std::string str;
};
std::vector<HOGE> m_hoges();
std::optional<HOGE> getHoge() const
{
    if (m_hoges.empty()) {
        return std::nullopt;
    }
    return m_hoges[0];
}
</syntaxhighlight>
<br>
上記の使用例を以下に示す。<br>
<syntaxhighlight lang="c++">
auto result = getHoge();
if (result.has_value()) {
    Hoge hoge = result.value();
    // ...略
}
else {
    // データが存在しない場合の処理
    // ...略
}
</syntaxhighlight>
<br>
または、C++17のif文と構造化束縛を使用して、より簡潔に記述することもできる。<br>
<syntaxhighlight lang="c++">
if (auto hoge = getHoge(); hoge) {
    // ...略
}
else {
    // データが存在しない場合の処理
    // ...略
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー