普通类型的类型特征

Type trait for trivial types

我希望有一个类型特征 return 对于任何不需要在使用前初始化内存并且其复制构造函数可以作为 memcpy 实现的类型都是正确的。

我希望它 return 对

成立

对于诸如 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,那么就这样吧。