是否可以为std :: array类型添加自己的构造函数?

时间:2018-07-19 10:17:59

标签: c++ c++14 stdvector stdarray constructor-overloading

我尝试为std::array类型添加自己的构造函数,但是我不确定是否可能以及如何做到这一点...

我尝试过这样的事情:

typedef unsigned char byte_t;

namespace std {
  template<std::size_t _Nm>
  array::array(std::vector<byte_t> data)
  {
    // Some content
  }
}

我想创建一种非常简单的机制将std::vector<byte_t>转换为std::array<byte_t, size>

  1. 有可能吗?
  2. 我该怎么办?

我正在使用C ++ 14(并且不能在我的项目中使用较新的标准)

2 个答案:

答案 0 :(得分:6)

构造函数是特殊的成员函数,必须在类定义中声明它们。在不更改类定义的情况下,不可能将构造函数添加到现有类中。

您可以使用工厂功能实现类似的效果:

template<size_t N, class T>
std::array<T, N> as_array(std::vector<T> const& v) {
    std::array<T, N> a = {};
    std::copy_n(v.begin(), std::min(N, v.size()), a.begin());
    return a;
}

int main() {
    std::vector<byte_t> v;
    auto a = as_array<10>(v);
}

答案 1 :(得分:0)

我怀疑这种转换的必要性,除了期望std :: array并且不能修改的函数之外。您有两种选择:

  1. Use the good old T* raw array underneath the vector。毕竟,std :: array旨在轻松管理与固定大小的C数组等效的对象。
  2. 通过使用迭代器上的函数使您的代码对容器不敏感。这是现代c ++期望的设计路径。您可以看看various operations in the algorithm library的可能实现。