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或标准会招致灾难。