閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

static変数を返す関数で、変数をlambdaで初期化するイディオム

tensorflowのソースにこんな実装があって、なるほどと思いました。

bool RequireCudnnDeterminism() {
  static bool require_cudnn_determinism = [] {
    // TODO(reedwm): Remove the TF_CUDNN_DETERMINISTIC env var.
    bool cudnn_deterministic = false;
    TF_CHECK_OK(tensorflow::ReadBoolFromEnvVar("TF_CUDNN_DETERMINISTIC",
                                               /*default_val=*/false,
                                               &cudnn_deterministic));
    return cudnn_deterministic;
  }();
  return tensorflow::OpDeterminismRequired() || require_cudnn_determinism;
}

この手の関数で、初回だけどこかから値を取り出して設定しておくみたいなのはよくやりますが(そうか?)、その処理のためにstatic変数を非constにしなきゃいけないのは嫌だなと思っていたんですよね。上記コードだとconstじゃないんですが、

int get_nantoka()
{
    static int const nantoka = [] {
        return 321;
    }();
    return nantoka;
}

実際にはこうも書けるので、かなり気持ちいいです。