类型与向量类成员无关
Type independent vector class member
我尝试为(简化的)Matlab v4 矩阵构建数据结构。这些矩阵具有以下结构:
- 一个包含 5 个
int32_t
变量的标头,这些变量决定了 Matix 的大小和内容。 - 包含名称的
char[]
数组 - 以及一个(或两个,如果是虚构内容)2D 向量
std::vector<std::vector<type>>
标题中指定的类型(int32_t
,例如float64_t
)
有没有办法泛化类型?我尝试在向量周围使用工厂和包装器,但由于虚拟函数的单一调度限制(不允许模板),这不起作用。
如果我尝试谷歌解决方案,我最终会遇到多态容器周围的问题,但这不是我想要的......设置标头后,类型保持不变。
我对C++比较陌生,所以可能有一些简单的技术可以解决这个问题,但目前我不知道。
此致敬意
编辑
根据要求,我将尝试更详细地解释我的意图。
矩阵具有以下结构:
- 标头 5 x 4 字节指定内容
- 一个 M0PT 值,包含:
FloatLayout * 1000 + NumericType * 10 + MatrixType
-- 这里 Floatlayout 指定了字节序,NumericType 保存了矩阵内容的类型,矩阵类型可以是 [ 完整、稀疏或文本 ] 我目前只考虑 Full。 -
mrows
行数 -
ncols
列数 -
imagflag
有一个虚部[0,1] -
namelength +1
- 一个 M0PT 值,包含:
- 以
namelength
字节为单位的名称作为char
-
mrows * ncols
标头中指定的 NumericType 元素
我希望这有帮助,我会澄清我尝试过的内容
这假设您不希望存储指向处理每种情况的接口的指针,而是直接使用相关类型。
template<class...>struct types {};
using matlab_types = types<int32_t, float64_t>; // etc
namespace details {
template<class types, template<class...>class target>
struct apply_types {};
template<class...Ts, template<class...>class target>
struct apply_types<types<Ts...>, target> {
using type = target<Ts...>;
};
}
template<class types, template<class...>class target>
using apply_types = typename details::apply_types<types, target>::type;
struct matlab_matrix {
int32_t a,b,c,d,e; // todo: give better names, defaults, etc
std::string name; // rather than a fixed size array
template<class...Ts>
using data_t = boost::variant< std::vector<Ts>... >;
apply_types<matlab_types, data_t> data;
};
此时,data
是 std::vector<int32_t>
和 std::vector<float32_t>
的类型安全联合。
我使用的是平面数组(而不是向量的向量),因为向量的向量用于"交错"存储:一个连续的二维数组应该存储在一个缓冲区中。
您可以编写一个执行正确操作的operator[]
(返回指向相关一维向量开头的指针),以及执行大小检查的at(size_t, size_t)
。
你必须编写构造函数并处理boost::variant
,但这是最简单的解决方案之一。
相关文章:
- C++:从其他类访问结构的私有成员向量
- 访问类成员向量最后一项的正确方法
- 将字符串推送到私有成员向量
- 访问其他类中多个对象的私有成员向量
- 如何在类的构造函数中定义成员向量的大小
- 如何对类成员向量进行排序
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 尝试从成员函数推送时不维护元素的成员向量
- C++ |无法将项添加到类成员向量
- 如何创建过滤流的成员向量
- 使用大型数据集初始化类成员向量的最有效方法
- 将C 成员向量包裹为Python命令
- 尝试保存到成员向量的连接-一次只保存一个
- 类成员向量上的迭代器未正确取消引用
- 如何在c++11中返回类成员向量
- 初始化构造函数C++中的成员向量
- 将类成员向量的内容复制到另一个向量中,然后将其交换回
- 推送到成员向量时的隔离错误
- 在堆上创建多态对象的数据成员向量
- 将此指针推回专用静态成员向量