我尝试为(简化的)Matlab v4矩阵构建数据结构。这些矩阵具有以下结构:
int32_t
变量的标题,用于确定Matix的大小和内容。char[]
数组
std::vector<std::vector<type>>
,int32_t
中指定类型的二维矢量float64_t
,例如。)有没有办法概括这种类型?我尝试使用工厂和向量周围的包装器,但由于虚拟函数的单一调度限制(不允许模板),这不起作用。
如果我尝试谷歌解决方案,我最终会遇到多态容器问题,但这不是我想要的......在设置标题后,类型保持不变。
我对C ++比较新鲜,所以可能有一些简单的技巧可以解决这个问题,但目前我还不知道。
最好的问候
修改
根据要求,我会尝试更详细地解释我的意图。
matlab矩阵具有以下结构:
FloatLayout * 1000 + NumericType * 10 + MatrixType
- 这里Floatlayout指定字节顺序,NumericType保存矩阵内容的类型,MatrixType可以是[完整,稀疏或文本]我现在只考虑完整。< / LI>
mrows
行数ncols
列数imagflag
有一个虚部[0,1] namelength +1
namelength
字节中的名称为char
mrows * ncols
标题中指定的NumericType元素我希望这会有所帮助,我会在一瞬间澄清我的尝试
答案 0 :(得分:2)
这假设您不希望存储指向处理每个案例的接口的指针,而是直接使用相关类型。
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>
的类型安全联盟。
我使用平面数组(而不是矢量矢量),因为矢量矢量用于“锯齿状”存储:连续的2维数组应存储在一个缓冲区中。
你可以写一个做正确事情的operator[]
(返回一个指向所讨论的一维向量开头的指针),以及一个进行大小检查的at(size_t, size_t)
。
你必须编写构造函数并处理boost::variant
,但这是最简单的解决方案之一。