如何在模板中调用类型的析构函数?

时间:2012-11-03 15:48:43

标签: c++ templates constructor destructor template-function

例如,我们有这样的功能:

template <typename TYPE>
void construct_and_destruct(TYPE & object)
{
    //...
}

我们 cant 调用构造函数和析构函数,如object.Type()object.~Type()(现在不是)(为什么? = C

要调用构造函数,我们可以new(&object) TYPE()。我不知道如何调用析构函数(没有存在的位置delete)。怎么做?

4 个答案:

答案 0 :(得分:4)

您可以将析构函数称为:

object.~TYPE();

但它可能不是您想要的,并且需要进行双重删除。

构造函数非常简单:

object = TYPE();

答案 1 :(得分:1)

我认为

object.~TYPE()object.~TYPE::TYPE()都是正确的。然而,听起来有点可疑,你想要实现什么目标?

答案 2 :(得分:0)

试试这个 Calling destructor with decltype and\or std::remove_reference,它对我来说调用非限定类型的析构函数(模板参数中未指定的内部类)...

答案 3 :(得分:0)

我遇到了一个略有不同的问题,但也是为了放置新/删除,解决方案应该是相似的。

给定一个依赖类型名称,展示位置新:

new (&foo) typename AT::T(arg, arg, arg);

关联的删除很棘手:

foo.~ typename AT::T();  // Doesn't work, nor do variations of syntax

现代解决方案似乎是 std::destroy_at(&foo) 但我的编译器没有完整的 C++17。但是,推出自己的基本版本并不困难:

template <typename T>
constexpr void destroy_at(T* p)
{
  p->~T();
}

看起来不错。