yohhoyの日記

技術的メモをしていきたい日記

なんちゃってScopeExit

nullptrを所有するshared_ptr」を使って何か面白いことが出来ないかと適当にひねり出した応用例。

C++11標準ライブラリだけで Boost.ScopeExit(スコープガード)のお手軽実装。

#include <memory>

#define MY_SCOPE_EXIT(name_, ...) \
  std::shared_ptr<void> name_(nullptr, [&](void*)__VA_ARGS__)

利用例:

void process(int a, int b)
{
  std::cout << "BEGIN" << std::endl;
  MY_SCOPE_EXIT(guard, {
    // 変数は(参照)キャプチャ済み
    std::cout << "EXIT" << func(a, b) << std::endl;
    /* カンマ(,)があっても大丈夫 */
  });

  // メイン処理
  std::cout << "PROCESSING" << std::endl;
}