首页 > 解决方案 > 关于 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';
  }

标签: c++shared-ptr

解决方案


给定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"));


推荐阅读