console - C++ 中 std::atexit 的替代方法是什么
问题描述
我想在程序关闭但未结束时删除文件。我试图用函数 std::atexit 来做,但如果那是类成员函数,它的参数不能是指向函数的指针。所以我想知道有没有简单的选择?
class User
{
std::experimental::filesystem::path file_path;
std::experimental::filesystem::path & get_file_path();
void clean_file_path();
void (User::*x)();
}
int main()
{
std::experimental::filesystem::path p = user.get_file_path();
user.x = & User::clean_file_path;
std::ofstream output(p, std::ios::binary | std::ios::trunc);
std::atexit(user.x);
}
解决方案
你可以在你的类中有一个静态函数,你可以用指向这个静态函数的指针调用“atexit”:
class User
{
public:
void clean();
static void cleanStatic();
};
int main()
{
void (User:: * pClean)() = &User::clean;
void (*pCleanStatic)() = &User::cleanStatic;
std::atexit(pCleanStatic);
}
您可以使用“atexit”注册多个函数,但该数量有限制,因此也许只注册一个可以处理所有对象工作的函数是一个更好的解决方案。
还有一件事:pCleanStatic 的类型和 pClean 的类型不一样:
- pCleanStatic 为 void(*)()
- pClean 无效(用户::*)()
"atexit" 需要一个 void(*)() 类型的参数。所以只接受 pCleanStatic 作为参数。在 Visual Studio 中,如果您尝试编译代码
std::atexit(pClean);
你会得到以下错误:
error C2664: 'int atexit(void (__cdecl *)(void))': cannot convert argument 1 from 'void (__thiscall User::* )(void)' to 'void (__cdecl *)(void)'
提到两种不同的类型。
推荐阅读
- python - 告诉脚本等到按钮可点击?
- eclipse - 在 Eclipse 调用时从命令行指定 Eclipse 工作区
- python - 根据先前列中满足的某些条件在数据框中创建新列
- javascript - 无法在阿波罗服务器突变中使用 console.log() 功能
- ruby - 法拉第正在将我的标题从大写更改为大写
- c++ - 如何访问谷歌测试夹具静态变量
- matplotlib - LOWESS曲线下的matplotlib填充
- javascript - axios delete .catch 命令在 void 中不存在
- node.js - axios.get 不返回数据
- c# - 在 tcpclient 套接字上收到的字符串的 C# 问题