【发布时间】:2016-10-17 20:12:09
【问题描述】:
我正在实现与std::vector 非常相似的东西,但在堆栈上使用数组而不是内存分配。
d-tor 调用一个使用 SFINAE 的函数。
- 如果
value_type是 POD,则函数的主体为空。 - 如果
value_type是std::string这样的普通类,则函数有一个主体并正确销毁所有数据。
现在,我希望能够将这个新的std::vector 用作constexpr。然而,即使 c-tor 被声明为 constexpr,代码也无法编译,因为该类具有非平凡的 d-tor。
这里是一小部分代码:
template<typename T, std::size_t SIZE>
class SmallVector{
constexpr SmallVector() = default;
~SmallVector(){
destructAll_<value_type>();
}
// ...
template<typename X>
typename std::enable_if<std::is_trivially_destructible<X>::value == true>::type
destructAll_() noexcept{
}
};
如果value_type 是 POD 并保留非 POD 数据类型的功能,我可以做些什么来使类成为 constexpr。
(当然不是同时)
【问题讨论】:
-
我会改为从
SmallVectorImpl<T, SIZE, is_trivially_destructible<T>::value>继承,它将有一个主要定义和一个专门用于可简单破坏的类型。两者之间的唯一区别是析构函数。 -
我的想法类似——一个只读基类和两个继承版本中的所有变异方法。你也可以用你的想法来回答吗,因为我看不到第三个模板“组件”有什么帮助。你的意思是从两个基类继承?
-
这种类型与
std::vector有多相似,真的吗?你宁愿重新实现std::array吗? Orrrr 是一个具有巨大自动存储阵列和大量新放置的向量吗? :) -
@LightnessRacesinOrbit - 是学术目的。并且就像带有后推和大量新放置的数组。
-
尝试使用 if constexpr?
标签: c++ c++14 constexpr sfinae