Оберните пользовательские типы из разных библиотек в С++

При использовании разных библиотек я всегда обнаруживал, что каждая из них имеет собственный тип для одного и того же «сущности реального слова».

Скажем, у меня есть проект, использующий точки в трех измерениях, я просто использую алгоритмы из OpenCv и PCL (библиотека облаков точек). Я оказался с этими типами для точки:

  • Point3_ для OpenCv
  • PointXYZ для PCL
  • Point3d мой пользовательский тип

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

Что было бы лучшим способом иметь какую-то абстракцию вокруг этого?


person Pluc    schedule 29.11.2012    source источник
comment
они бинарно совместимы?   -  person    schedule 29.11.2012
comment
Я не уверен, что вы подразумеваете под бинарной совместимостью, но я думаю, что ответ - нет: разные размеры, элементы, отступы... Мне, вероятно, нужно какое-то приведение, но я ожидал какой-то черной магии.   -  person Pluc    schedule 29.11.2012
comment
опубликовать объявление всех трех структур   -  person    schedule 29.11.2012
comment
@ThePluc Ну, если речь идет только о черной магии, вы, вероятно, можете предполагать, что они совместимы в двоичном формате. Пока они не используют виртуальные функции или необычное выравнивание (например, для использования с SSE), они должны составлять 3 floats/doubles один за другим. Так что злой reinterpret_cast может подойти. В противном случае, если все они имеют []-оператор, просто сделайте свои шаблоны алгоритмов (и, возможно, сами предоставьте некоторые фундаментальные вещи, такие как normalize...).   -  person Christian Rau    schedule 29.11.2012


Ответы (1)


Вы могли бы сделать что-то вроде этого

template<class T>
    struct Getter{

};

template<class T>
struct Getter<Point3_<T>>{
     typedef T& type;
     static type getx(Point3_<T>& p){
         return p.x;
     }
};
template<>
struct Getter<PointXYZ>{
     typedef float& type;
     static type getx(PointXYZ& p){
         return p.x;
     }
};

template <class T>
point_x(T& p) -> Getter<T>::type{
      return Getter<T>::getx(p);

}

Сделайте то же самое для y и z. Затем измените свои алгоритмы, чтобы использовать шаблон, и вместо использования p.x = ... используйте

getx(p) = ..
auto x = getx(p)
person John Bandela    schedule 29.11.2012
comment
Если вам повезет, все они имеют перегруженный []-оператор, и вам даже не нужны эти getx оболочки. - person Christian Rau; 29.11.2012