C++ lambda(或函数)C+内的静态初始化+;
如何确保静态字段的初始化在lambda的主体(或函数)中只发生一次C++ lambda(或函数)C+内的静态初始化+;,c++,lambda,static-initialization,C++,Lambda,Static Initialization,如何确保静态字段的初始化在lambda的主体(或函数)中只发生一次 [](字符串foo){ 静态平面散列集; //用一些项目填充集合的代码。 //问题:如何确保此填充代码只执行一次? 返回集合.contains(foo); } 仅初始化一次,即仅在控件第一次通过其声明时初始化。在所有后续调用中,将跳过声明。因此,您可以将填充集合的代码放入一个函数(或另一个lambda),然后调用它并使用返回的集合作为初始值设定项 [] (string foo) { static flat_hash_set
[](字符串foo){
静态平面散列集;
//用一些项目填充集合的代码。
//问题:如何确保此填充代码只执行一次?
返回集合.contains(foo);
}
仅初始化一次,即仅在控件第一次通过其声明时初始化。在所有后续调用中,将跳过声明。因此,您可以将填充集合的代码放入一个函数(或另一个lambda),然后调用它并使用返回的集合作为初始值设定项
[] (string foo) {
static flat_hash_set<string> set = populate_the_set();
return set.contains(foo);
}
[](字符串foo){
静态平面\u散列\u集=填充\u集();
返回集合.contains(foo);
}
或
[](字符串foo){
静态平面散列集=[](){
平面散列集;
//用一些项目填充集合的代码。
返回集;
} ();
返回集合.contains(foo);
}
一种方法是使用一个helper函数返回集合,并在lambda中使用此函数初始化集合
static flat_hash_set<string> set = MyHelperFunction();
static flat\u hash\u set=MyHelperFunction();
您还可以使用lambda而不是helper函数来保持代码与lambda类似
flat_hash_set<string> set = []() { /* populate and return set here */ }();
flat_hash_set=[](){/*在此处填充并返回set*/}();
另一种方法是使用lambda并将其传递给初始化集合的对象
就我个人而言,我会使用第二个选项,因为它将代码保持在lambda的本地,您不需要全局帮助函数或
std::once_flag
objectstatic setset=createSet()然后理论上我可以做flat_hash_set=[](){/*在这里填充*/}()代码>,对吗?@onetwother这也是另一个选项。我会在答案中加上这个
static flat_hash_set<string> set = MyHelperFunction();
flat_hash_set<string> set = []() { /* populate and return set here */ }();