类型与向量类成员无关

Type independent vector class member

本文关键字:成员 向量 类型      更新时间:2023-10-16

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

  • 一个包含 5 个int32_t变量的标头,这些变量决定了 Matix 的大小和内容。
  • 包含名称的char[]数组
  • 以及一个(或两个,如果是虚构内容)2D 向量std::vector<std::vector<type>>标题中指定的类型(int32_t,例如float64_t

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

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

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

此致敬意


编辑

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

矩阵具有以下结构:

  1. 标头 5 x 4 字节指定内容
    • 一个 M0PT 值,包含: FloatLayout * 1000 + NumericType * 10 + MatrixType -- 这里 Floatlayout 指定了字节序,NumericType 保存了矩阵内容的类型,矩阵类型可以是 [ 完整、稀疏或文本 ] 我目前只考虑 Full。
    • mrows行数
    • ncols列数
    • imagflag有一个虚部[0,1]
    • namelength +1
  2. namelength 字节为单位的名称作为char
  3. 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;
};

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

我使用的是平面数组(而不是向量的向量),因为向量的向量用于"交错"存储:一个连续的二维数组应该存储在一个缓冲区中。

您可以编写一个执行正确操作的operator[](返回指向相关一维向量开头的指针),以及执行大小检查的at(size_t, size_t)

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