我正在编写一个内存管理库,需要显式调用析构函数,在我的设计中,我有一个指向对象的析构函数方法的指针,我编写如下代码:
void (*p)() = foo.~Foo;
但是我得到了
错误:无法将类型为“ void(Foo ::)()noexcept”的类型的“ Foo ::〜Foo”转换为“ void(*)()”类型
我尝试了其他格式,void (Foo:: (*p))() noexcept = foo.~Foo;
但失败了。
那么将析构函数分配给指针的正确方法是什么?
编辑:在运行时,我的代码不知道堆中的类型,因此无法使用foo。〜Foo()。我需要一个适合所有析构函数的生成指针,这可能吗?
不允许使用析构函数的地址。
但是,您可以制作一个非常简单的模板函数,并使用它:
template<class T>
void destruct(const T* x) {
x->~T();
}
现在,只需从以下位置获取指针:
destruct<Foo>
您可以使用例如。std::bind
(或lambda),如果您需要绑定到实际对象:
std::bind(&destruct<Foo>, foo_ptr);
请注意,一旦绑定,就不能将其转换为原始函数指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句