定义我的2D数组以支持[]和()访问操作

时间:2014-06-29 07:57:39

标签: c++ arrays boost eigen boost-multi-array

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

但是,我不能暂停开发。因此,我想开始编写代码,以便将我的图像类型定义从ublas,Eigen或multiarray交换到另一个。我不认为typedef会在这里保存我,因为元素访问器操作符在这些库中是不同的。

例如,您可以访问2D数组的元素' myArray'如下三个库中的每一个: 提升多阵列:myArray [x] [y] 提升ublas:myArray(x,y) Eigen 2DMatrix:myArray(x,y)

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

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

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

如果你能帮助我开始,我会写一个代码并粘贴在这里进行进一步审查。 附:我没有使用这三种类型的任何丰富的API。我只是创建它们,并访问它们的元素。

2 个答案:

答案 0 :(得分:4)

我会在这种情况下使用Proxy Pattern。您只需轻松环绕代理并定义一个将使用底层对象的唯一接口。希望这会有所帮助......

编辑:

我想这个链接也应该有用:Template Proxy

答案 1 :(得分:0)

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

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

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

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) ; }

无论如何,如果你更喜欢将你的课程包装到一个界面中,我认为使用适当的优化将确保你没有效率损失。