1

我正在用 C++ 编写一个图像处理应用程序。为了定义我的图像类型,我正在考虑使用 boost 多数组、boost ublas 矩阵或 Eigen 2D 矩阵。我想为我打算做的所有各种操作仔细地对这些进行基准测试,并相应地选择一个。

但是,我不能暂停开发。因此,我想以这样一种方式开始编写代码,以便将我的图像类型定义从 ublas、Eigen 或多数组交换到另一个。我认为 typedef 不会在这里救我,因为这些库中的元素访问器运算符是不同的。

例如,您在三个库中的每一个中访问二维数组“myArray”的元素如下: Boost multiarray : myArray[x][y] Boost ublas : myArray (x,y) Eigen 2DMatrix : myArray(x,y)

您可以看到冲突是在 [][] 与 ( _ , _ ) 访问元素的方式之间。因此,我无法为一种类型编写代码,并使用简单的 typedef 使其与另一种类型一起使用。

任何想法如何解决这个问题?

我正在考虑将底层类型包装成一个新的通用类型,它标准化了访问方法,然后我可以简单地使用 typedef 将一种类型换成另一种类型,有什么我应该担心的陷阱吗?它会花费我很多效率吗?哪些语言功能可以在这里得到最好的利用?

如果您可以帮助我开始,我将编写代码并将其粘贴到此处以供进一步审查。PS 我没有使用这三种类型的任何丰富的 API。我只是在创建它们并访问它们的元素。

4

2 回答 2

4

在这种情况下,我会使用代理模式。您只需轻松包装代理并定义一个将使用您的底层对象的唯一接口。希望这可以帮助....

编辑:

我想这个链接也应该有用:模板代理

于 2014-06-29T08:10:13.043 回答
0

如果您不想失去任何效率,可以使用定义:

typedef boost::multiarray MyArray ;
#define GET_AT(a,i,j) a[i][j]

然后,您只需在切换类型时更改typedefand 。define您还可以执行模板函数(或适当的重载函数):

template <class Array>
inline ... getAt (Array <...> const& a, int i, int j) { return a[i][j] ; }

inline ... getAt (2DMatrix <...> const& a, int i, int j) { return a(i,j) ; }

无论如何,如果您希望将类包装到单个接口中,我认为使用适当的优化将确保您没有效率损失。

于 2014-06-29T08:14:42.030 回答