13,009
回編集
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> |