C ++如何将析构函数添加到匿名class?

C++ how to add destructor to anonymous class?

如何在 C++ 中向匿名 class 添加析构函数?就像在 PHP 中,如果我想 运行 一些东西,当我的 class 超出范围时,它会是

$foo = new class() {
        public $i=0;
        public function __destruct()
        {
            echo "foo is going out of scope!\n";
        }
    };

但在具有普通非匿名 classes 的 C++ 中,您使用 ~ClassName(){} 指定析构函数,但匿名 classes 没有名称!那么如何将析构函数添加到

class {public: int i=0; } foo;

在 C++ 中?我尝试使用变量名称作为 class 名称,但这没有用:

class {
public:
  int i;
  ~foo(){std::cout << "foo is going out of scope!" << std::endl;}
} foo;

导致

prog.cc: In function 'int main()':
prog.cc:51:31: error: expected class-name before '(' token
   51 |     class {public: int i=0; ~foo(){std::cout << "foo is going out of scope!" << std::endl;};} foo;
      |                               ^

我也试过只指定 ~ 但这也不起作用,

class {
public:
  int i=0;
  ~(){std::cout << "foo is going out of scope" << std::endl;}
} foo;

结果

prog.cc:48:30: error: expected class-name before '(' token
   48 |     class {public: int i=0; ~(){std::cout << "foo is going out of scope" << std::endl;};} foo;
      |                              ^

这在 C++ 中无法完成。但是,真正的 C++ 匿名 类 类似物称为匿名命名空间:

namespace {
   struct foo {
     // ... whatever
     ~foo();
   };
}

// ... later in the same C++ source.

foo bar;

现在您可以在这个特定的 C++ 源文件中的任何地方使用和引用 foo。其他 C++ 源文件可能有自己的匿名命名空间,有自己的 foos,不会产生冲突。最终结果与 C-style 匿名结构(a.k.a。类)几乎相同,除了它们不是真正的匿名,只有它们的命名空间是。