我想有一个类型特征,对于任何不需要在使用之前初始化内存的类型返回true,并且其拷贝构造函数可以实现为memcpy。
我希望它为
返回true和false表示std :: vector之类的东西,以及任何需要构造的对象(大多数对象)。
std :: is_pod似乎非常接近我想要的,因为它也为std :: array返回true,但不幸的是它并没有为我自己的il :: array返回true。有没有办法去教#34; is_pod我的il :: array的行为是普通的旧数据,还是一种简单的方法来推广我自己的类型特征?
有关信息,这是我的il :: array:
的实现namespace il {
template <typename T, int n>
class array {
private:
T data_[n > 0 ? n : 1];
public:
array(const T& value)
: array() {
for (int k = 0; k < n; ++k) {
data_[k] = value;
}
}
array(std::initializer_list<T> list) {
IL_ASSERT(n == static_cast<int>(list.size()));
for (int k = 0; k < n; ++k) {
data_[k] = *(list.begin() + k);
}
}
const T& operator[](int k) const {
IL_ASSERT(static_cast<unsigned int>(k) < static_cast<unsigned int>(n));
return data_[k];
}
T& operator[](int k) {
IL_ASSERT(static_cast<unsigned int>(k) < static_cast<unsigned int>(n));
return data_[k];
}
T* data() {
return data_;
}
int size() const {
return n;
}
};
}
答案 0 :(得分:1)
我想有一个类型特征,对于任何不需要在使用之前初始化内存的类型返回true,并且其拷贝构造函数可以实现为
memcpy
。
您正在描述琐碎的类型。您可以使用std::is_trivial
检查该内容。
std::is_pod
似乎与我想要的非常接近
这也要求类型具有标准布局,这会对其数据成员的声明方式和位置施加限制。
不幸的是,对于我自己的
,它不会返回trueil::array
也许这不是标准布局,在这种情况下is_trivial
应该适合您。或许它在任何情况下都不是微不足道的;在这种情况下,您可能希望修复它以便它。
UPDATE :它有一个用户声明的默认构造函数,这使它变得非常重要。因为它只检查编译时常量的值,所以可以用static_assert
替换它;或者将n
更改为更明智的无符号类型,例如std::size_t
,以消除对完整性检查的需要。
但您仍然需要将其声明为默认
array() = default;
否则其他构造函数的存在将删除它。
有没有办法去教授&#34;
is_pod
il::array
表现为普通旧数据?
您可以编写自己的特征,并为您的类型提供专业化。但那会很奇怪;如果您的类型应该是微不足道或POD,那么就这样做。