平凡类型的类型特征
Type trait for trivial types
我希望有一个类型特征,它对任何类型返回true,该类型在使用之前不需要初始化内存,并且其复制构造函数可以作为memcpy实现。
我希望它返回 true
- 整数
- 类型(字符、短整型、整型、整型整数等) 浮
- 点数类型(浮点数、双精度数) il::array(il::array
- 是我自己的std::array实现),因为T是int,double,il::array等之一。
对于诸如 std::vector 之类的东西,以及任何在构造中需要某些东西的对象(大多数对象),则为 false。
std::is_pod 似乎非常接近我想要的,因为它也为 std::array 返回 true,但不幸的是,它没有为我自己的 il::array 返回 true。有没有办法"教导"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;
}
};
}
我希望有一个类型特征,它对任何类型返回 true,该类型在使用前不需要初始化内存,并且其复制构造函数可以作为
memcpy
实现。
您正在描述一种简单的类型。您可以使用 std::is_trivial
.
std::is_pod
似乎非常接近我想要的
这还要求类型具有标准布局,这会限制其数据成员的声明方式和位置。
不幸的是,对于我自己的
il::array
,它并没有返回
也许这不是标准布局,在这种情况下,is_trivial
应该适合您。或者,也许无论如何它实际上都不是微不足道的;在这种情况下,您可能希望修复它,以便它。
更新:它有一个用户声明的默认构造函数,这使得它不平凡。由于它只检查编译时常量的值,因此您可以将其替换为static_assert
;或者将n
更改为更明智的无符号类型(如 std::size_t
),以消除对健全性检查的需要。
但您仍然需要将其声明为默认值
array() = default;
否则,其他构造函数的存在将删除它。
有没有办法"教导"
is_pod
我的il::array
表现为普通的旧数据?
你可以写出自己的特质,专门针对你的类型。但那会很奇怪;如果你的类型应该是微不足道的或 POD,那就让它这样吧。
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C ++类型特征:确保子类实现方法
- 根据类型特征更改函数定义?
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 在C++中创建新的类型特征
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- std::begin-类型特征中未考虑用户定义的重载
- 在类型特征修改后,无法限定类型
- 使用类型特征的部分类专用化
- 为什么不调用预期的函数?我是否对类型特征的理解不正确?
- 了解类型特征的体系结构
- 为什么使用某些类型特征的模板类型会导致模板扣除失败
- 有了C++类型特征,有没有办法避免铸造
- 哪种类型特征表明该类型是可分配的?(元组,对)
- 一种类型特征,标识哪个类提供通过重载解析选择的函数
- 如何使用类型特征正确推断引用的参数
- 如何通过扩展以下类型特征来删除 decltype(&MyClass::funct) 部分?
- 从标准库类型特征继承
- 为什么类型特征不适用于命名空间范围内的类型?