有没有一种方法可以使全局函数/静态成员函数一次可呼出
Is there a way to make global function/static member function callable once?
要澄清,我不是在谈论多线程环境。我经常遇到一种情况,我必须在初始化功能中分配一些资源(因此在终止功能中释放资源),并且我想避免将其调用两次。我想知道是否有C/C 中的内置关键字可以使其可召唤一次。比静态局部变量更复杂的东西,我会在我的所有初始化功能中重复使用,例如
static bool isInitialized = false;
if (!isInitialized) {
isInitialized = true;
//...
}
或也许还不错,我可以将其隐藏在宏Callable_once后面。
我对C/C 03/C 11/C 14的任何解决方案开放。
编辑:
我之所以在全球范围上使用初始/终止方案的原因主要是由于我倾向于为不应该一次实例化的实体创建名称空间,并避免使用Singnleton在上面进行的鼓励。这个帖子。当然,使用类会更容易,因为我只需使用构造函数/驱动器,但是如何初始化(仅一次)此类实体(名称空间)?
有 std::call_once
,尽管显示为与线程一起使用,而不仅仅是一个线程应用程序,但也可以由一个线程应用程序使用。
您可能会遇到的一个问题是,如果它抛出,则不被视为初始化。如果需要,您可以使用try/catch
保护初始化功能。
在您的情况下,您可能需要一个公共静态功能和另一个私有功能。公共静态功能将执行std::call_once
。这样的东西:
class my_class
{
public:
static void init()
{
std::call_once(m_initialized, private_init);
}
private:
static void private_init()
{
... // init here
}
static std::once_flag m_initialized;
};
如您所见,它看起来与您的功能完全相同,除了隐藏了if()
和标志开关。您也可以将m_initialized
标志保留在第一个函数中作为静态变量。
一个区别是std::call_once
是线程安全的。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何为非常量和常量重载实现一次成员函数?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 如何一次运行3个函数?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 仅在函数中设置静态变量一次
- 有没有办法一次运行 3 个创建窗口函数?
- 在可变函数调用中执行一次语句
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 为什么一次包装 typedef 函数签名与原始签名不匹配
- 跨类的多个实例调用函数一次
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 如何在不使用静态变量的情况下从递归函数中只调用另一个函数一次
- 子类中的虚拟函数调用父函数一次
- 如何使函数一次使用一个 3 个不同的变量
- 使c++编译器优化到在map初始化时只调用构造函数一次
- 只初始化部分函数一次
- 圆函数:一次调用绘制多个圆