是否可以为 std::array 类型添加自己的构造函数?
Is it possible to add own constructor for std::array type?
我尝试为 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>
。
- 有可能吗?
- 我该怎么做?
我正在使用 C++14(我不能在我的项目中使用更新的标准)
构造函数是特殊的成员函数,它们必须在class定义中声明。在不更改 class 定义的情况下,无法将构造函数添加到现有 class。
您可以使用工厂函数实现类似的效果:
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);
}
我怀疑这种转换的必要性,除了需要 std::array 且无法修改的函数。你有两个选择:
- Use the good old T* raw array underneath the vector。毕竟,std::array 旨在轻松管理相当于固定大小的 C 数组。
- 通过在迭代器上使用函数,让您的代码无法识别容器。这是现代 c++ 期望的设计路径。您可以查看 various operations in the algorithm library.
的可能实现
我尝试为 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>
。
- 有可能吗?
- 我该怎么做?
我正在使用 C++14(我不能在我的项目中使用更新的标准)
构造函数是特殊的成员函数,它们必须在class定义中声明。在不更改 class 定义的情况下,无法将构造函数添加到现有 class。
您可以使用工厂函数实现类似的效果:
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);
}
我怀疑这种转换的必要性,除了需要 std::array 且无法修改的函数。你有两个选择:
- Use the good old T* raw array underneath the vector。毕竟,std::array 旨在轻松管理相当于固定大小的 C 数组。
- 通过在迭代器上使用函数,让您的代码无法识别容器。这是现代 c++ 期望的设计路径。您可以查看 various operations in the algorithm library. 的可能实现