在销毁此对象时推导出对象的模板类型

时间:2013-12-18 20:24:57

标签: c++ templates

情况:我有一个deque声明为deque<intmax_t> tab,我想用推导出的模板参数来销毁它。我试过tab.~deque<__decltype(tab.at(0))>(),这给了我编译错误:

Csrt.cpp: In function 'int main(int32_t, char**)':
Csrt.cpp:303:34: the type being destroyed is 'std::deque<long long int>',
 but the destructor refers to 'std::deque<long long int&>'
  tab.~deque<__decltype(tab.at(0))>();
                                  ^

问题是:这样的事情是可行的吗?
我知道我不想做的事:创建虚拟变量。喜欢:auto dummy = tab.at(0)
我希望是可行的:单行析构函数。

我也尝试过:tab.~deque<__decltype(tab[0])>()结果:与上述相同。

我认为这是所有需要的信息。提前谢谢。

3 个答案:

答案 0 :(得分:4)

问题是deque中的at成员函数定义如下:

intmax_t &at(size_t pos);

因此,decltype(x.at(0))实际上已解析为intmax_t&

您可以使用remove_reference类型特征:

#include <type_traits>
x.~deque<std::remove_reference<decltype(x.at(0))>::type>();

但如果您使用每个标准容器中可用的有用成员typedef,则会更容易:

x.~deque<decltype(x)::value_type>();

当然,对于这种特殊情况,我认为你只需要为析构函数使用注入的类名:

x.~deque();

答案 1 :(得分:2)

你正在基于堆栈的对象上调用析构函数,所以我认为你有兴趣稍后使用placement new,类似于这篇SO C++ stack allocated object, explicit destructor call

在Ubuntu 10.04上使用g ++ 4.4.3,只需使用没有模板装饰的析构函数就可以为我编译并运行:

tab.~deque();

我有什么遗失的吗?


我还不能对其他帖子发表评论,但rodrigo's答案很棒。除此之外,这里还有一篇关于explicit destructors in templated contexts主题的相当长但信息量很大的帖子。

答案 2 :(得分:1)

编写函数来推断类型通常比尝试自己指定类型更容易。怎么样:

template <typename T>
void murder(T& t)
{ t.~T(); }

在C ++ 11中,您只需使用注入的类名:

tab.~deque();