Я разрабатываю библиотеку C++, где пользователь будет предоставлять сложные входы, такие как матрицы и кватернионы. Я не хочу переопределять эти типы, поэтому, внутренне, я буду использовать библиотеку Eigen.Должны ли быть доступны сторонние типы в API моей библиотеки C++
Я пытаюсь решить, как наилучшим образом разоблачить эти типы для клиентов моих библиотек и придумал несколько вариантов для моего API. В качестве примера я использую тип кватерниона , но это может относиться в равной степени к матрицам и тому подобным. Кроме того, , хотя я специально говорю об экспонировании типов Eigen, я думаю, что этот вопрос может одинаково хорошо примениться к другим используемым внешним библиотекам.
1) Используйте только основные C++ типы
Этот вариант требует от своих клиентов, чтобы передавать данные в по основным типам. Для например, для передачи в кватернион (4 элемента), можно было бы сделать:
void my_func(double my_quat[4])
2) Expose Типы Эйген в
Эйген предоставляет несколько калиброванных типов для массивов и кватернионов. Для Например, если функция требует кватерниона, я мог бы использовать Эйген в Quaterniond
типе (который на самом деле является ЬурейиМ для Quaternion<double>
):
void my_func(const Eigen::Quaterniond& my_quat)
3) Создайте простую оболочку для различных типов для клиентов
я мог бы создать очень простой тип кватернионов (скажем, какой-то простой структуры), что клиенты должны создать (возможно, через какое-то функции фабричной) в проход к моему API:
void my_func(const quaternion_t& my_quat)
Моя библиотека преобразует тип quaternion_t
в мое внутреннее представление Eigen .
Мне не нравится вариант 1 слишком много, так как я хочу, чтобы там было более сильное чувство , набрав мои API. Вариант 2 потребует от моих клиентов также использовать Eigen, а не , чтобы упомянуть о потенциальных проблемах с совместимостью, если они используют другую версию Eigen (например, Eigen - это библиотека только для заголовков, если это имеет значение ). Это оставляет опцию 3.
Что думают люди? Я в основном ответил на свой вопрос? Есть ли какие-нибудь примеры?
Вопросы, относящиеся
Смежный вопрос был задан here, но на самом деле не вдаваться в подробности, следует ли один выставить внешние типы.
Как насчет опции 3, с конструкторами, которые принимают оба варианта 1 и 2? Семантика C++ позволяет вам перенаправлять типы объявлений достаточно хорошо, чтобы это работало (клиенты без Eigen могут по-прежнему включать заголовок и не работать во время компиляции). – Lalaland
Я думал о чем-то подобном, но, я думаю, я немного неясен в том, как пересылать объявить типы шаблонов typedef'd, хотя, я думаю, в моем случае я, вероятно, ограничу клиентов передачей определенного экземпляра типов (как 'Quaternion' в отличие от 'Quaternion '). –
plasma
Я также немного расплывчатый о том, что произойдет, если клиент использует конструктор, чтобы сделать тип моей библиотеки с их Eigen-типом, но они используют другую версию Eigen, которая может, скажем, иметь небольшое изменение в реализации. – plasma