Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ std::call_是否可以重置一次?_C++_C++17_Std Call Once - Fatal编程技术网

C++ std::call_是否可以重置一次?

C++ std::call_是否可以重置一次?,c++,c++17,std-call-once,C++,C++17,Std Call Once,我不久前根据编写了一个函数,该函数只调用一次可调用函数,直到它被重置: 模板 无效终止(可调用(&f,bool reset=false,bool start\u closed=false)无异常{ 静态布尔一次=启动\关闭; 如果(!一次){ 一次=真; 调用(f); } 如果(重置){ 一次=假; } } 今天,我学习了exists,跨线程工作,使用具有参数的可调用函数,测试异常安全性,基本上像我一样围绕std::invoke(至少是MSVC实现) 这听起来很棒,如果可能的话,我更喜欢调用预

我不久前根据编写了一个函数,该函数只调用一次可调用函数,直到它被重置:

模板
无效终止(可调用(&f,bool reset=false,bool start\u closed=false)无异常{
静态布尔一次=启动\关闭;
如果(!一次){
一次=真;
调用(f);
}
如果(重置){
一次=假;
}
}
今天,我学习了exists,跨线程工作,使用具有参数的可调用函数,测试异常安全性,基本上像我一样围绕
std::invoke
(至少是MSVC实现)

这听起来很棒,如果可能的话,我更喜欢调用预先存在的函数,而不是编写自己的函数


正如Unreal的文档所建议的那样,有时我可能需要通过重置内部标志再次调用callable是否可以重置std::call\u once以允许再次调用底层的callable?

标准称之为“once\u标志”并不是开玩笑。这是一个只设置一次的标志


当然,您可以使用不同的once标志对象多次调用该函数。但要正确地执行此操作,您需要将可能尝试将其称为新once flag对象的每个线程交给它。它不能只是一个全局或静态对象;实际上,您必须将每个新调用封送到所有要调用它的线程。

好的,您可以通过使用新位置创建一个新调用来重置标志。我看不到标准中有任何东西可以排除这种可能性,尽管它闻起来有点鱼腥味,听起来很恶心,是个坏主意(@Casey:好吧,你是一个试图不止一次地给某件事打电话的人。粗俗是意料之中的;)电话一次看起来像是“神奇的静力学,但没有静力学”被标准暴露给我。比如,
static const bool unused=(static_cast(f()),true)没有噪音。我接受这一回答,但我的理解是,说“不,这不是它的用途。”:)不正确地使用STL或标准会招致灾难。