我正在编写一个内存管理库,需要显式调用析构函数,在我的设计中我有一个指向对象的析构函数方法的指针,我编写如下代码:
void (*p)() = foo.~Foo;
但是我得到了
error: cannot convert ‘Foo::~Foo’ from type ‘void (Foo::)() noexcept’ to type ‘void (*)()’
我尝试了其他格式,例如 void (Foo::(*p))() noexcept = foo.~Foo;
但失败了。
那么将析构函数分配给指针的正确方法是什么?
编辑: 在运行时我的代码不知道它在我的堆中是什么类型,所以我不能使用 foo.~Foo()。我需要一个适合所有析构函数的生成指针,这可能吗?
最佳答案
解决方案:使用模板包装器
不允许获取析构函数的地址。
但是,您可以创建一个非常简单的模板函数并使用它:
template<class T>
void destruct(const T* x) {
x->~T();
}
现在,只需从以下位置获取指针:
destruct<Foo>
您可以使用例如。 std::bind
(或 lambda)如果您需要绑定(bind)到实际对象:
std::bind(&destruct<Foo>, foo_ptr);
请注意,一旦绑定(bind),它就无法转换为原始函数指针。
关于c++ - 如何将析构函数分配给指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58556130/