我要创建类,处理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_data
为vector<vector<double>>
,其中包含一个元素的N个向量或N个元素的一个向量。
我尝试使用委派的构造函数,但没有成功。 另外,我尝试在第二个构造函数中创建新的临时2d矢量,但它打破了通过引用传递以编辑基础数据的想法。
答案 0 :(得分:2)
使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);
编辑:
如果要将一维数组的大小写转换为二维数组,可以重载一维向量的构造函数,并通过将向量复制到其中来初始化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;
};
答案 1 :(得分:1)
您可以将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。