Определение моего 2D-массива для поддержки операций доступа [] и ()

Я пишу приложение для обработки изображений на C ++. Чтобы определить мой тип изображения, я рассматриваю возможность использования либо расширенного мульти-массива, либо матрицы повышающего убласа, либо собственной матрицы 2D. Я хотел бы тщательно сравнить их для всех различных операций, которые я намерен сделать, и выбрать один из них соответственно.

Однако я не могу позволить себе приостановить разработку. Следовательно, я хотел бы начать писать код таким образом, чтобы можно было легко поменять свое определение типа изображения с ublas, Eigen или multiarray на другое. Я не думаю, что typedef спасет меня здесь, потому что операторы доступа к элементам отличаются в этих библиотеках.

Например, вы получаете доступ к элементам двухмерного массива myArray следующим образом в каждой из трех библиотек:
Увеличить мульти-массив: myArray [x] [y] Повысьте ублас: myArray (x, y)
Собственный 2DMatrix: myArray (x, y)

Вы можете видеть, что конфликт между [] [] и (_, _) способом доступа к элементам. Следовательно, я не могу написать код для одного типа и заставить его работать с другим типом, используя простой typedef.

Есть идеи как обойти это?

Я думаю об обертывании базового типа в новый универсальный тип, который стандартизирует методологию доступа, тогда я могу просто поменять один тип на другой, используя typedef,
Есть ли какие-то подводные камни, о которых я должен волноваться?
Это будет стоить мне много эффективности?
Какая языковая особенность может использовать здесь лучше всего?

Пожалуйста, помогите мне начать, я напишу код и вставлю его сюда для дальнейшего просмотра.
Постскриптум Я не использую какой-либо из богатых API этих трех типов. Я просто создаю их и получаю доступ к их элементам.

1

Решение

Я бы использовал Прокси шаблон для этого случая. Вы просто легко обернетесь вокруг прокси и определите уникальный интерфейс, который будет использовать ваши базовые объекты. Надеюсь это поможет….

Редактировать:

Я думаю, что эта ссылка также может быть полезна: Шаблон прокси

4

Другие решения

Если вы не хотите терять эффективность, вы можете использовать определение:

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

Тогда вы просто измените typedef а также 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) ; }

В любом случае, если вы предпочитаете объединять свой класс в единый интерфейс, я думаю, что использование правильной оптимизации не даст вам потери эффективности.

0