あ、お久しぶりです。
最近、新人研修でC++17を使う機会があり、「規格が新しくなったくらいでそんなに変わるのかな?」と思っていました。
実際に使ってみると、毎日のコーディングがかなり楽になる機能がいくつもありました。
今回は、その中でも特に「これは便利!」と感じた3つを紹介します。
1. if文の初期化
C++14ではこんな感じでした。
auto enemy = FindEnemy();
if (enemy)
{
enemy->Damage(10);
}
変数はif文を抜けても生き続けます。
C++17では
if (auto enemy = FindEnemy(); enemy)
{
enemy->Damage(10);
}
と書けます。
変数のスコープをif文だけに限定できるので、
- 余計な変数が残らない
- 「この変数はここだけで使う」という意図が伝わる
という点が気に入りました。
2. std::optional
今までは、値が存在しないことを表現するためにnullptrや特殊な値を返すことがよくありました。
例えば
Player* FindPlayer();
や
int GetPlayerIndex(); // 見つからなければ -1
のような設計です。
C++17では
std::optional<int> GetPlayerIndex();
のように書けます。
使う側も
if (auto index = GetPlayerIndex())
{
players[*index].Update();
}
となり、「値がない可能性がある」ということがコードからすぐ分かります。
3. std::string_view
これは一番「なるほど!」と思った機能でした。
例えば
void LoadTexture(std::string_view path);
としておけば、
LoadTexture("player.png");
std::string path = "enemy.png";
LoadTexture(path);
どちらもそのまま渡せます。
文字列をコピーしないので効率も良く、APIも作りやすいと感じました。
まとめ
C++17には他にも便利な機能がありますが、今回の新人研修で特に感動したのは次の3つでした。
- if文の初期化
- std::optional
- std::string_view
どれも派手な機能ではありませんが、「毎日コードを書く人ほど恩恵を感じる機能」だと思います。
学生時代はC++14しか使ったことがなかったので、「規格が変わるだけでこんなに書きやすくなるんだ」と実感した新人研修でした。
今後C++20も使う機会があれば、またこんな感じでまとめてみようと思っています。