平凡类型的类型特征

Type trait for trivial types

本文关键字:类型 特征      更新时间:2023-10-16

我希望有一个类型特征,它对任何类型返回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,那就让它这样吧。