将1D或2D向量传递给同一类的构造函数

Pass 1d or 2d vector to constructor of same class

本文关键字:一类 构造函数 1D 2D 向量      更新时间:2023-10-16

我即将创建类,处理双打的2D向量。我想将向量的向量传递,或者将双打的简单向量(如果第二维为1个元素(到构造函数。另外,它是用于编辑基础数据的模态对话框,因此,我是通过参考传递向量的。

一些代码以参考我要实现的目标:

class TableEditDialog {
    using Table2d = std::vector<std::vector<double>>;
public:
    TableEditDialog(Table2d & data) : m_data( data ) {}
    TableEditDialog(std::vector<double> & data); // ?
private:
    Table2d& m_data;
};

如果通过n个元素传递了简单的双重向量,我需要 m_datavector<vector<double>>,它包含一个元素的n个向量,或一个元素的一个向量。

我试图在没有成功的情况下使用委派构造函数。另外,我尝试在第二个构造函数中创建新的临时2D向量,但是它打破了通过参考来编辑基础数据传递的想法。

使TableEditDialog成为类模板,以便可以在构造时指定类型。

template<class T>
class TableEditDialog {
public:
  TableEditDialog(T& data) : m_data( data ) {}
private:
  T& m_data;
};

您还可以发挥功能来帮助类型扣除:

template<class T>
TableEditDialog<T> make_table_edit_dialog(T& data) {
  return data;
}

然后您可以做:

std::vector<double> d1d;
std::vector<std::vector<double>> d2d;
auto ted1 = make_table_edit_dialog(d1d);
auto ted2 = make_table_edit_dialog(d2d);

编辑:

如果您想将1D数组案例转换为2D数组,则可以通过将向量复制到其中来初始化1D向量的构造函数,并初始化m_data

class TableEditDialog {
  using Array1d = std::vector<double>;
  using Array2d = std::vector<Array1d>;
public:
  TableEditDialog(Array2d& data) : m_data( data ) {}
  TableEditDialog(Array1d& data) : m_data(1, data) {}
private:
  Array2d m_data;
};

您可以将1D向量转换为2D向量存储元素的参考。这种解决方案的唯一缺点是,您不允许使用此1D向量直到完成编辑,其他地方可能会破裂。

这是示例:

TableEditDialog(std::vector<double> & data) {
    std::vector<std::vector<std::reference_wrapper<double>>> result(data.size());
    std::transform(data.begin(), data.end(), result.begin(), [](double& d) {return {{d}};});
}

不过,我没有测试过,也许您需要在lambda中使用{{std::forward(d)}}

剩下的唯一问题是您对M_DATA的定义不同,但是相同的访问语义,因此您要么需要使用模板代码访问它,要么使用STD :: variant。