GameProgrammar's Night

ゲームプログラム系の覚え書き

C++ でローカル関数

 「関数やメソッド内でメモリを確保し、エラーになったらメモリを解放してエラーを返す」みたいな処理ってまま書くと思います。

data* create_data()
{
   data* p = new data();
  
   /*** 処理 ***/

   if(/*** エラー1 ***/)
   {
      std::cerr << "エラー1" << endl;
      delete p;
      return nullptr;
   }

   /*** 処理 ***/

   if(/*** エラー2 ***/)
   {
      std::cerr << "エラー2" << endl;
      delete p;
      return nullptr;
   }

   // 正常終了
   return p;
}

 エラーが複数ある場合、「メモリ解放してエラー返す」という部分に同じコードを複数行書かないといけません。ちょっと嫌です。
 従来のC++ではマクロを書くか、gotoを使うなどで対処してたと思います。
 最近のC++では、ラムダが使えるようになりましたので、ラムダをローカル関数のように使うことで対応することができるようになりました。

data* create_data()
{
   data* p = new data();
   
   auto err = [&p](const string& mes)->data*
              {
                  std::cerr << mes << std::endl;
                  delete p;
                  return nullptr;
              };
  
   /*** 処理 ***/

   if(/*** エラー1 ***/) return err("エラー1");

   /*** 処理 ***/

   if(/*** エラー2 ***/) return err("エラー2");

   // 正常終了
   return p;
}