关于 std::unique_prt() 和 decltype()
About std::unique_prt() and 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"));
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"));