为普通类型输入特征

时间:2015-01-31 12:55:24

标签: c++ typetraits

我想有一个类型特征,对于任何不需要在使用之前初始化内存的类型返回true,并且其拷贝构造函数可以实现为memcpy。

我希望它为

返回true
  • 整数类型(char,short int,int,long int等)
  • 浮点数类型(float,double)
  • il :: array(il :: array是我自己的std :: array实现),T是int,double,il :: array等之一。

和false表示std :: vector之类的东西,以及任何需要构造的对象(大多数对象)。

std :: is_pod似乎非常接近我想要的,因为它也为std :: array返回true,但不幸的是它并没有为我自己的il :: array返回true。有没有办法去教#34; 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;
    }
};

}

1 个答案:

答案 0 :(得分:1)

  

我想有一个类型特征,对于任何不需要在使用之前初始化内存的类型返回true,并且其拷贝构造函数可以实现为memcpy

您正在描述琐碎的类型。您可以使用std::is_trivial检查该内容。

  

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

这也要求类型具有标准布局,这会对其数据成员的声明方式和位置施加限制。

  

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

,它不会返回true

也许这不是标准布局,在这种情况下is_trivial应该适合您。或许它在任何情况下都不是微不足道的;在这种情况下,您可能希望修复它以便它。

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

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

array() = default;

否则其他构造函数的存在将删除它。

  

有没有办法去教授&#34; is_pod il::array表现为普通旧数据?

您可以编写自己的特征,并为您的类型提供专业化。但那会很奇怪;如果您的类型应该是微不足道或POD,那么就这样做。