Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 平凡类型的类型特征_C++_Typetraits - Fatal编程技术网

C++ 平凡类型的类型特征

C++ 平凡类型的类型特征,c++,typetraits,C++,Typetraits,我希望有一个类型特征,对于任何在使用之前不需要初始化内存并且其副本构造函数可以作为memcpy实现的类型,它都返回true 我希望它返回真实的时间 整数类型(字符、短整型、整型、长整型等) 浮点数类型(浮点、双精度) il::array(il::array是我自己的std::array实现),因为T是int、double、il::array等的一种 对于std::vector之类的对象,以及任何在构造时需要某些东西的对象(大多数对象),都是false std::is_pod似乎与我想要的非常

我希望有一个类型特征,对于任何在使用之前不需要初始化内存并且其副本构造函数可以作为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。有没有什么方法可以“教”我的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;
    }
};

}
名称空间il{
模板
类数组{
私人:
T数据[n>0?n:1];
公众:
数组(常量T和值)
:数组(){
对于(int k=0;k
我希望有一个类型特征,对于任何在使用之前不需要初始化内存并且其副本构造函数可以实现为
memcpy
的类型,它都返回true

你描述的是一个平凡的类型。你可以和我一起检查

std::is_pod
似乎非常接近我想要的

这还要求该类型具有标准布局,从而限制其数据成员的声明方式和位置

不幸的是,对于我自己的
il::array

也许这不是标准的布局,在这种情况下,
是微不足道的
应该适合您。或者,它在任何情况下都不是微不足道的;在这种情况下,您可能希望修复它,使其保持稳定

更新:它有一个用户声明的默认构造函数,这使得它非常重要。因为它只检查编译时常量的值,所以可以用
static_assert
替换它;或者将
n
更改为更合理的无符号类型,如
std::size\t
,以消除对健全性检查的需要

但您仍然需要将其声明为默认值

array() = default;
否则,其他构造函数的存在将删除它

有没有什么方法可以“教导”
我的
il::array
是否表现为普通的旧数据


你可以根据自己的类型写下自己的特点。但那会很奇怪;如果您的类型应该是平凡的或POD,那么就这样做。

结果是std::is_triple::value为false,我希望它为true。顺便说一下,std::is_triple::value为true。我的il::array几乎与std::array相同。@InsideLoop:在这种情况下,您已经做了一些事情,使它变得非常重要;声明了一个默认、复制或移动构造函数,或者为它指定了一个非平凡的数据成员或基类。我已经发布了我的il::array实现。我不明白是什么让il::array变得非同寻常。@InsideLoop:现在您已经发布了代码,我们可以看到有一个非同寻常的默认构造函数。您需要删除它,使其变得微不足道。如果您想保持健全性检查,可以将其替换为
static\u assert
。或者将
n
设为unsigned可能更明智。删除默认构造函数没有任何区别(我已经编辑了文章以删除它)。关于unsigned int,我想避开它们,因为在STL中使用它们作为索引是一个错误(由Bjarne Stroustrup、Scott Meyer、Herb Sutter等承认)。这是我实现自己的std::vector和std::array的众多原因之一。