键入独立的向量类成员

时间:2016-03-15 19:20:05

标签: c++ matlab c++11 vector

我尝试为(简化的)Matlab v4矩阵构建数据结构。这些矩阵具有以下结构:

  • 包含5个int32_t变量的标题,用于确定Matix的大小和内容。
  • 包含名称
  • char[]数组
  • 和一个(或两个虚构内容)标题(std::vector<std::vector<type>>int32_t中指定类型的二维矢量float64_t,例如。)

有没有办法概括这种类型?我尝试使用工厂和向量周围的包装器,但由于虚拟函数的单一调度限制(不允许模板),这不起作用。

如果我尝试谷歌解决方案,我最终会遇到多态容器问题,但这不是我想要的......在设置标题后,类型保持不变。

我对C ++比较新鲜,所以可能有一些简单的技巧可以解决这个问题,但目前我还不知道。

最好的问候

修改

根据要求,我会尝试更详细地解释我的意图。

matlab矩阵具有以下结构:

  1. 标题5 x 4字节指定内容
    • 包含以下内容的M0PT值:FloatLayout * 1000 + NumericType * 10 + MatrixType - 这里Floatlayout指定字节顺序,NumericType保存矩阵内容的类型,MatrixType可以是[完整,稀疏或文本]我现在只考虑完整。< / LI>
    • mrows行数
    • ncols列数
    • imagflag有一个虚部[0,1]
    • namelength +1
  2. namelength字节中的名称为char
  3. mrows * ncols标题中指定的NumericType元素
  4. 我希望这会有所帮助,我会在一瞬间澄清我的尝试

1 个答案:

答案 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;
};

此时,datastd::vector<int32_t>std::vector<float32_t>的类型安全联盟。

我使用平面数组(而不是矢量矢量),因为矢量矢量用于“锯齿状”存储:连续的2维数组应存储在一个缓冲区中。

你可以写一个做正确事情的operator[](返回一个指向所讨论的一维向量开头的指针),以及一个进行大小检查的at(size_t, size_t)

你必须编写构造函数并处理boost::variant,但这是最简单的解决方案之一。