lambda(或函数)C++ 中的静态初始化

static initialization inside lambda (or function) C++

如何确保静态字段的初始化只在 lambda 的主体(或函数的主体)内发生一次?

[] (string foo) {
   static flat_hash_set<string> set;
   // code to populate the set with some items.
   // Question: how do I ensure this population code executed exactly once?

   return set.contains(foo);
}

Static local variables 只初始化一次,即只有第一次控制通过它们的声明。在所有进一步的调用中,声明被跳过。因此,您可以将填充集合的代码放入一个函数(或另一个 lambda)中,然后调用它并使用返回的集合作为初始值设定项。

[] (string foo) {
   static flat_hash_set<string> set = populate_the_set();
   return set.contains(foo);
}

[] (string foo) {
   static flat_hash_set<string> set = [] () {
       flat_hash_set<string> set;
       // code to populate the set with some items.
       return set;
   } ();
   return set.contains(foo);
}

一种方法是使用 returns 集的辅助函数,并使用此

在 lambda 中初始化集
static flat_hash_set<string> set = MyHelperFunction();

您也可以使用 lambda 而不是辅助函数来将代码保留在 lambda 的本地,例如

flat_hash_set<string> set = []() { /* populate and return set here */ }();

另一种方法是使用 std::call_once 并将 lambda 传递给初始化集合的那个。

我个人会使用第二个选项,因为它将代码保留在 lambda 本地并且您不需要全局辅助函数或 std::once_flag 对象