关于 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"));