Я пишу приложение для обработки изображений на C ++. Чтобы определить мой тип изображения, я рассматриваю возможность использования либо расширенного мульти-массива, либо матрицы повышающего убласа, либо собственной матрицы 2D. Я хотел бы тщательно сравнить их для всех различных операций, которые я намерен сделать, и выбрать один из них соответственно.
Однако я не могу позволить себе приостановить разработку. Следовательно, я хотел бы начать писать код таким образом, чтобы можно было легко поменять свое определение типа изображения с ublas, Eigen или multiarray на другое. Я не думаю, что typedef спасет меня здесь, потому что операторы доступа к элементам отличаются в этих библиотеках.
Например, вы получаете доступ к элементам двухмерного массива myArray следующим образом в каждой из трех библиотек:
Увеличить мульти-массив: myArray [x] [y]
Повысьте ублас: myArray (x, y)
Собственный 2DMatrix: myArray (x, y)
Вы можете видеть, что конфликт между [] [] и (_, _) способом доступа к элементам. Следовательно, я не могу написать код для одного типа и заставить его работать с другим типом, используя простой typedef.
Есть идеи как обойти это?
Я думаю об обертывании базового типа в новый универсальный тип, который стандартизирует методологию доступа, тогда я могу просто поменять один тип на другой, используя typedef,
Есть ли какие-то подводные камни, о которых я должен волноваться?
Это будет стоить мне много эффективности?
Какая языковая особенность может использовать здесь лучше всего?
Пожалуйста, помогите мне начать, я напишу код и вставлю его сюда для дальнейшего просмотра.
Постскриптум Я не использую какой-либо из богатых API этих трех типов. Я просто создаю их и получаю доступ к их элементам.
Я бы использовал Прокси шаблон для этого случая. Вы просто легко обернетесь вокруг прокси и определите уникальный интерфейс, который будет использовать ваши базовые объекты. Надеюсь это поможет….
Редактировать:
Я думаю, что эта ссылка также может быть полезна: Шаблон прокси
Если вы не хотите терять эффективность, вы можете использовать определение:
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) ; }
В любом случае, если вы предпочитаете объединять свой класс в единый интерфейс, я думаю, что использование правильной оптимизации не даст вам потери эффективности.