ぺんぎんメモ

プログラミングのメモです。たまに私生活のことや鬱っぽいことを書きます。

再帰ラムダ関数の型定義を省略する方法

C++では、通常、再帰呼び出しを行うラムダ関数には型定義を与える必要がある。
しかし、少し冗長な書き方をすることで型定義を省略できる。

auto dfs = [&](auto dfs, int u) -> void {
  for (auto v : g[u]) dfs(dfs, v);
};

-> voidの部分は忘れやすいので注意。
型定義を省略しない書き方は次のようになる。

function<void(int)> dfs = [&](int u) {
  for (auto v : g[u]) dfs(v);
};

どちらが楽かは微妙なところ。

僕の場合、dfsを書き始めるときは引数のことはまだ考えていなくて「とりあえずautoにしたい」という気持ちが働くし、引数を増やすときにfunction<...>の部分も書き換える必要があって面倒なので、前のほうの書き方を好む。

しかし、前のほうの書き方では関数呼び出し時にdfs(dfs, ...);のように書く必要があって、最初はよくコンパイルエラーを出した。けれどもう慣れた。