【发布时间】:2021-04-28 03:08:32
【问题描述】:
我不久前编写了一个基于Unreal Engine 4's blueprint implementation 的函数,它只调用一次可调用对象,直到它被重置:
template<typename Callable>
void DoOnce(Callable&& f, bool reset = false, bool start_closed = false) noexcept {
static bool once = start_closed;
if(!once) {
once = true;
std::invoke(f);
}
if(reset) {
once = false;
}
}
今天我了解到std::call_once 的存在,跨线程工作,使用有参数的可调用对象,测试异常安全性,并且基本上像我的一样环绕std::invoke(至少是MSVC 实现)。
这听起来很棒,而且,如果可能的话,我更喜欢调用预先存在的函数而不是编写自己的函数。
就像 Unreal 的文档所暗示的那样,有时我可能需要通过重置内部标志来再次调用可调用对象; 可以重置 std::call_once 以允许再次调用底层可调用对象吗?
【问题讨论】:
-
好吧,您可以通过使用 placement-new 创建一个新标志来重置标志。我在标准中没有看到任何可以排除这种可能性的东西,尽管它闻起来有点腥
标签: c++ c++17 std-call-once