使用 std::type T 的数组来构造可从 T 构造的 std::数组
Use std::array of type T to construct std::array of type constructable from T
请考虑以下类型:
struct Part
{
float data;
};
struct Wrap
{
Wrap( const Part& p )
:data( p.data )
{}
float data;
};
现在我想用std::array<Part, N>
来初始化一个std::array<Wrap, N>
。
int main()
{
std::array<Part, 3> parts{ Part{ 1.0f }, Part{ 2.0f }, Part{ 3.0f } };
std::array<Wrap, 3> wrappers( parts );
return 0;
}
(这会抛出错误"conversion from 'std::array<Part, 3>' to non-scalar type 'std::array<Wrap, 3>' requested"
(
如何使用T
类型的std::array
来初始化可从T
构造的类型std::array
?
您可以使用帮助程序函数来自动转换:
// Convert each element based on a sequence of indices:
template<typename ToType, typename FromType, std::size_t... Indices>
std::array<ToType, sizeof...(Indices)>
convert_impl(const std::array<FromType, sizeof...(Indices)>& input, std::index_sequence<Indices...>)
{
return {ToType(std::get<Indices>(input))...};
}
// Wraps convert_impl to hide the use of index_sequence from users:
template<typename ToType, typename FromType, std::size_t N>
std::array<ToType, N> convert(const std::array<FromType, N>& input)
{
return convert_impl<ToType>(input, std::make_index_sequence<N>{});
}
int main()
{
std::array<Part, 3> parts {Part{1.0f}, Part{2.0f}, Part{3.0f}};
std::array<Wrap, 3> wraps = convert<Wrap>(parts);
return 0;
}
可能的简单选项包括:
O. 改用vector
(数组仍然是邪恶的0_o(。
std::vector<Part> ps{Part{1.0}, Part{2.0}, Part{3.0}};
std::vector<Wrap> ws(ps.cbegin(), ps.cend());
一、明确
。std::array<Part, 3> parts{ Part{ 1.0f }, Part{ 2.0f }, Part{ 3.0f } };
std::array<Wrap, 3> wrappers = {parts[0], parts[1], parts[2]};
二、拆分构造和初始化。
struct Unwrap {
Unwrap() {}
Unwrap(Part const &p): data(p.data) {}
float data;
};
int main() {
std::array<Part, 3> parts{ Part{ 1.0f }, Part{ 2.0f }, Part{ 3.0f } };
std::array<Unwrap, 3> unwrappers;
std::copy(parts.cbegin(), parts.cend(), unwrappers.begin());
}
顺便说一句,您在初始化Part
带有括号的代码甚至可以编译吗?我只能通过将它们更改为大括号来做到这一点。
相关文章:
- std::向量与传递值的动态数组
- std::vector的包装器,使数组的结构看起来像结构的数组
- 初始化具有非默认构造函数的std::数组项的更好方法
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 将 int 数组转换为 std::vector<int*>
- 输入std::数组时出现问题
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 为什么std::vector比数组慢
- C++如何生成std::数组列表
- 捕获lambda中的std::数组
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::数组边界检查如何工作?
- 通过unique_ptr访问std::数组
- 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset
- 对象的数组-STD ::数组 - 构造函数初始化问题
- 标准::数组<std::array<T、N2>、N> 数据成员上的括号运算符重载
- 从未来对象数组std::vector中检索值
- 如何将动态数组(std::vector)传递给odbc函数SQLBindParameter