c++ - 关于 std::unique_prt() 和 decltype()
问题描述
是什么std::unique_ptr<std::FILE, decltype(&close_file)> fp(std::fopen("demo.txt", "r"), &close_file);
意思?
我知道std::uqiue_ptr
是一个唯一的指针。但我无法理解整个表达。
有人可以帮我一个忙吗?
void close_file(std::FILE* fp) { std::fclose(fp); }
std::cout << "Custom deleter demo\n";
std::ofstream("demo.txt") << 'x'; // prepare the file to read
{
std::unique_ptr<std::FILE, decltype(&close_file)> fp(std::fopen("demo.txt", "r"),
&close_file);
std::cout<<typeid((&close_file)).name()<<std::endl;
if(fp) // fopen could have failed; in which case fp holds a null pointer
std::cout << (char)std::fgetc(fp.get()) << '\n';
}
解决方案
给定void close_file(std::FILE* fp) { std::fclose(fp); }
decltype(&close_file)
是void(*)(stdFILE*)
(函数指针)。
您可以提供自定义删除器std::unique
,这就是这里所做的:
std::unique_ptr<std::FILE, decltype(&close_file)> fp(std::fopen("demo.txt", "r"),
&close_file);
我认为拥有更好的删除器会更好:
struct file_closer
{
void operator()(std::FILE* fp) const { std::fclose(fp); }
};
甚至
template <auto* func>
using Functor = std::integral_constant<decltype(func), func>;
using file_closer = Functor<&std::fclose>;
用作
std::unique_ptr<std::FILE, file_closer> fp(std::fopen("demo.txt", "r"));
推荐阅读
- css - 如何使用 vue js 作用域样式
- c# - Nunit : 对依赖于其他值的值进行单元测试
- multidimensional-array - 意外维度的numpy数组
- java - 创建自定义类的数组
- flask - Gunicorn 不记录错误和打印语句
- javascript - 如何循环一个对象以形成条件
- dart - 为什么分配在 Dart 中的工作方式与在 Python 中的不同?
- matlab - 如何在 Matlab Simullink 中转换 pu SI 单位制?
- ruby-on-rails - AWS弹性beantalk没有获取环境变量
- html - 如何自动绑定放大器状态(来自远程源)?