C++11 中不同类型的对象的 std::array 的替代方案
Alternatives to std::array for objects of different types in C++11
我正在寻找有关如何组织和访问数据的更好解决方案。 我的数据是一组结构(在下面的示例中_array_10
和_array_20
(,其中包含不同大小的std::array
(请参阅下面的my_data
(。 理想情况下,我想访问它,因为它是具有不同长度的结构数组,但这是不允许的,因为不同的长度是不同的类型。 我在下面的解决方案有效,但我发现它非常丑陋(特别是void *
数组(。
问题 1.关于如何拥有更安全、更高效/便携或至少不那么丑陋的解决方案的任何想法?
问题 2.没有模板的建议解决方案是否可移植?它依赖于长度存储在其余数据之前的事实,因为将指针转换为长度错误的对象会弄乱对第一个可变长度字段之后的所有字段的访问。
我的局限性包括:
- C++11
- 标准库
- 没有
std::vector
- 内存使用使我无法简单地分配具有最大可能长度的
my_data
数组 - 大部分数据(
_array_10
、_array_20
等(将被放置在专门为它保留的内存区域中
使用 data_view 和模板需要了解构建时数组的长度。如果我们能避免它,那就太好了。
- 问题经过编辑,包括纪尧姆·拉西科特提出的解决方案
#include <iostream>
#include <array>
std::array<void *, 2> _ptrs;
template <int length>
struct my_data
{
int array_length;
std::array<int, length> something;
std::array<int, length> data;
my_data()
{
array_length = length;
}
};
struct my_data_view
{
int array_length;
const int * something;
const int * data;
template <int length>
my_data_view(my_data<length> const & data_in) :
array_length(length),
something(data_in.something.data()),
data(data_in.data.data())
{}
};
template <int length>
void
print_element(int array_idx, int element)
{
my_data<length> * ptr = reinterpret_cast<my_data<length> *>(_ptrs[array_idx]);
std::cout << "array " << length << ", data[" << element << "] = " << ptr->data[element] << ".n";
}
void
print_element(int array_idx, int element)
{
my_data<1> * ptr = reinterpret_cast<my_data<1> *>(_ptrs[array_idx]);
int length = ptr->array_length;
int data_to_print = 0;
switch (length)
{
case 10:
{
data_to_print = reinterpret_cast<my_data<10> *>(_ptrs[array_idx])->data[element];
break;
}
case 20:
{
data_to_print = reinterpret_cast<my_data<20> *>(_ptrs[array_idx])->data[element];
break;
}
}
std::cout << "array " << length << ", data[" << element << "] = " << data_to_print << ".n";
}
void
print_element(my_data_view view, int element)
{
int length = view.array_length;
int data_to_print = view.data[element];
std::cout << "array " << length << ", data[" << element << "] = " << data_to_print << ".n";
}
int
main()
{
my_data<10> _array_10;
my_data<20> _array_20;
_ptrs[0] = static_cast<void *>(&_array_10);
_ptrs[1] = static_cast<void *>(&_array_20);
_array_10.data[5] = 11;
_array_20.data[5] = 22;
std::cout << "using templaten";
print_element<10>(0, 5);
print_element<20>(1, 5);
std::cout << "nwithout templaten";
print_element(0, 5);
print_element(1, 5);
std::cout << "nusing data_viewn";
print_element(my_data_view(_array_10), 5);
print_element(my_data_view(_array_20), 5);
}
您可以创建一个不分配以下内容的动态视图类:
struct my_data_view
{
int array_length;
std::span<int> something;
std::span<int> data;
template<int length>
my_data_view(my_data<length> const& data) :
array_length{length}, something{data.something}, data{data.data}
{}
};
跨度只是一个指针和一个大小。如果您无权访问std::span
(从 C++20 开始(,您可以简单地将这些成员替换为int*
并使用array_length
作为大小。
此my_data_view
类型是这样使用的:
void
print_element(my_data_view view, int element)
{
int length = view.array_length;
int data_to_print = view.data[element];
std::cout << "array " << length << ", data[" << element << "] = " << data_to_print << ".n";
}
这是适用于std::span
和简单int*
的代码。
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 应对"Bring all the zeros to the back of the array"面试挑战的良好C++解决方案