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