普通类型的类型特征
Type trait for trivial types
我希望有一个类型特征 return 对于任何不需要在使用前初始化内存并且其复制构造函数可以作为 memcpy 实现的类型都是正确的。
我希望它 return 对
成立
- 整数类型(char、short int、int、long int 等)
- 浮点数类型(float、double)
- il::array(il::array 是我自己实现的 std::array)因为 T 是 int、double、il::array 等之一
对于诸如 std::vector 之类的东西以及任何在构造时需要某些东西的对象(大多数对象)都是 false。
std::is_pod 似乎非常接近我想要的,因为它也 return 对于 std::array 是正确的,但不幸的是它不是 return 正确的为我自己 il::array。有什么方法可以 "teach" 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;
}
};
}
I would like to have a type trait that returns true for any type which does not need memory to be initialised before being used and whose copy constructor can be implemented as a memcpy
.
您描述的是普通类型。您可以使用 std::is_trivial
.
检查
std::is_pod
seems to be quite close to what I want
这还要求类型具有标准布局,这限制了其数据成员的声明方式和位置。
unfortunately it does not return true for my own il::array
也许这不是标准布局,在这种情况下 is_trivial
应该适合您。或者也许它在任何情况下都不是微不足道的;在这种情况下,您可能需要修复它。
UPDATE:它有一个用户声明的默认构造函数,这使得它非常重要。由于它除了检查编译时常量的值外什么都不做,因此您可以将其替换为 static_assert
;或将 n
更改为更合理的无符号类型,如 std::size_t
以消除完整性检查的需要。
但您仍然需要将其声明为默认值
array() = default;
否则其他构造函数的存在将删除它。
Is there any way to "teach" is_pod
that my il::array
behaves as plain old data?
您可以编写自己的特征,并针对您的类型进行专门化。但这很奇怪;如果您的类型应该是微不足道的或 POD,那么就这样吧。
我希望有一个类型特征 return 对于任何不需要在使用前初始化内存并且其复制构造函数可以作为 memcpy 实现的类型都是正确的。
我希望它 return 对
成立- 整数类型(char、short int、int、long int 等)
- 浮点数类型(float、double)
- il::array(il::array 是我自己实现的 std::array)因为 T 是 int、double、il::array 等之一
对于诸如 std::vector 之类的东西以及任何在构造时需要某些东西的对象(大多数对象)都是 false。
std::is_pod 似乎非常接近我想要的,因为它也 return 对于 std::array 是正确的,但不幸的是它不是 return 正确的为我自己 il::array。有什么方法可以 "teach" 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;
}
};
}
I would like to have a type trait that returns true for any type which does not need memory to be initialised before being used and whose copy constructor can be implemented as a
memcpy
.
您描述的是普通类型。您可以使用 std::is_trivial
.
std::is_pod
seems to be quite close to what I want
这还要求类型具有标准布局,这限制了其数据成员的声明方式和位置。
unfortunately it does not return true for my own
il::array
也许这不是标准布局,在这种情况下 is_trivial
应该适合您。或者也许它在任何情况下都不是微不足道的;在这种情况下,您可能需要修复它。
UPDATE:它有一个用户声明的默认构造函数,这使得它非常重要。由于它除了检查编译时常量的值外什么都不做,因此您可以将其替换为 static_assert
;或将 n
更改为更合理的无符号类型,如 std::size_t
以消除完整性检查的需要。
但您仍然需要将其声明为默认值
array() = default;
否则其他构造函数的存在将删除它。
Is there any way to "teach"
is_pod
that myil::array
behaves as plain old data?
您可以编写自己的特征,并针对您的类型进行专门化。但这很奇怪;如果您的类型应该是微不足道的或 POD,那么就这样吧。