Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ lambda(或函数)C+内的静态初始化+;_C++_Lambda_Static Initialization - Fatal编程技术网

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

C++ lambda(或函数)C+内的静态初始化+;,c++,lambda,static-initialization,C++,Lambda,Static Initialization,如何确保静态字段的初始化在lambda的主体(或函数)中只发生一次 [](字符串foo){ 静态平面散列集; //用一些项目填充集合的代码。 //问题:如何确保此填充代码只执行一次? 返回集合.contains(foo); } 仅初始化一次,即仅在控件第一次通过其声明时初始化。在所有后续调用中,将跳过声明。因此,您可以将填充集合的代码放入一个函数(或另一个lambda),然后调用它并使用返回的集合作为初始值设定项 [] (string foo) { static flat_hash_set

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

[](字符串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
object

static setset=createSet()flat_hash_set=[](){/*在这里填充*/}(),对吗?@onetwother这也是另一个选项。我会在答案中加上这个
static flat_hash_set<string> set = MyHelperFunction();
flat_hash_set<string> set = []() { /* populate and return set here */ }();