我将要创建类,处理2维双精度向量。我希望将向量的向量或双精度的简单向量(在这种情况下,第二维是1个元素宽度)传递给构造器。此外,它还用于编辑底层数据的模式对话框,因此,我通过引用传递vector。
下面是我想要实现的一些参考代码:
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个元素的doubles的简单向量的情况下,我需要m_data
是vector<vector<double>>
,它包含一个元素的N个向量,或者是一个包含N个元素的向量。
我尝试过使用委托构造函数,但没有成功。此外,我还试图在第二个构造函数中创建新的临时2d向量,但它打破了通过引用传递来编辑底层数据的想法。
发布于 2019-06-25 09:17:25
使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;
};
发布于 2019-06-25 14:20:08
您可以将一维向量转换为存储元素引用的二维向量。这种解决方案的唯一缺点是,在你完成编辑之前,你不能玩这个一维矢量,否则其他地方的东西可能会崩溃。
以下是示例:
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来访问它。
https://stackoverflow.com/questions/56745595
复制相似问题