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