gpt4 book ai didi

c++ - 单个 "data-carrying"类的各种接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:31 25 4
gpt4 key购买 nike

我正在尝试实现一系列为三角矩阵或对称矩阵提供(公共(public))接口(interface)的类,但我想避免复制内存(即进行大量就地操作)。

我想在 C++ 中执行此操作的方法是实现一个类或结构,它只是一个包含矩阵数据的 vector (因为我只关心三角矩阵,所以我只需要存储大约一半的矩阵。 ).我们将此“数据传输”类称为 SquareTriangularMatrix。现在,可以以不同方式访问此矩阵中的数据,具体取决于数据应被视为上三角、下三角还是对称。

我认为多态性不能应用于我的情况,因为我希望 SquareTriangularMatrix 的同一对象根据上下文具有不同的接口(interface)。有时 SquareTriangularMatrix 可以被视为下三角矩阵,但其他一些可能是它的转置:上三角矩阵,等等。

是否有解决此问题的设计模式?在此上下文中的任何提示或指南将不胜感激。

非常感谢

最佳答案

您可以为您的存储类创建适配器类,如下所示:

struct SquareTriangularMatrix {
// constructor, maybe operator[], etc
int* values;
int nrows;
int ncolumns;
};

struct UpperTriangleMatrix {
UpperTriangleMatrix (SquareTriangularMatrix& data): data(data) {}
int at (unsigned row, unsigned column) const {
if (row > column) return 0;
return data.values [row * data.ncolumns + column];
}
private:
SquareTriangularMatrix& data;
};

然后你可以创建那个类UpperTriangleMatrix嵌套在 SquareTriangularMatrix并添加类似 SquareTriangularMatrix::as_upper() 的功能它将返回使用该矩阵构造的适配器。

另一种方法是创建函数 asSquareTriangularMatrix这将允许稍后添加自定义适配器,如下所示:

struct SquareTriangularMatrix {
//...
template <class T> T
as () { return T(*this); }
};

//usage:
SquareTriangularMatrix m;
auto upper = m.as <UpperTriangleMatrix>();

使用这种方法,您可以随时将矩阵转换为您希望满足 as 的任何适配器。模板(非常简单和广泛),并在本地扩展任何文件中的适配器列表。

你也可以按照STL允许的方式转换时间(std::duration_cast):

template <typename T> T& matrix_cast (SquareTriangularMatrix& m) { return T(m); }

SquareTriangularMatrix m;
auto upper = matrix_cast <UpperTriangleMatrix>(m);

它的工作方式与函数 as<> 相同从前面的示例来看,这只是一个品味问题。

关于c++ - 单个 "data-carrying"类的各种接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37208507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com