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, ...);
のように書く必要があって、最初はよくコンパイルエラーを出した。けれどもう慣れた。