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

时间:2018-02-05 15:38:01

标签: c++ lambda static-initialization

如何确保静态字段的初始化只在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);
}

2 个答案:

答案 0 :(得分:8)

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);
}

答案 1 :(得分:6)

执行此操作的一种方法是使用辅助函数返回集合并使用此

初始化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。

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