Estoy desarrollando una biblioteca C++ donde el usuario proporcionará entradas complejas, como matrices y cuaterniones. No quiero tener que volver a implementar estos tipos, así que, internamente, usaré la biblioteca Eigen.En caso de que existan tipos de terceros expuestos en la API de mi biblioteca C++
Estoy tratando de decidir sobre la mejor manera de exponer estos tipos a los clientes de mis bibliotecas ' y he encontrado algunas opciones para mi API. Utilizo un tipo quaternion como ejemplo, pero esto podría aplicarse por igual a matrices y demás. Además, aunque estoy hablando específicamente de exponer los tipos de Eigen, supongo que esta pregunta puede aplicarse igualmente a otras bibliotecas externas en uso.
1) el uso de C++ sólo los tipos básicos
Esta opción requeriría clientes para pasar los datos a través de los tipos básicos. Para ejemplo, para pasar en un cuaternión (4 elementos), se podría hacer:
void my_func(double my_quat[4])
2) Exponer Tipos de Eigen
Eigen proporciona varios tipos de plantilla para matrices y cuaterniones. Para ejemplo, si una función requiere un cuaternión, que podría utilizar de Eigen Quaterniond
tipo (que en realidad es un typedef para Quaternion<double>
):
void my_func(const Eigen::Quaterniond& my_quat)
3) Crear un contenedor simple para los diferentes tipos de clientes
que podría crear un tipo muy simple cuaternión (por ejemplo, algún tipo de estructura sencilla) que clientes tendrían que crear (tal vez a través de algún tipo de función de fábrica) para pase a mi API:
void my_func(const quaternion_t& my_quat)
Mi biblioteca podría convertir el tipo quaternion_t
en mi Eigen representación interna.
No me gusta la opción 1 demasiado porque quiero que haya un sentido más fuerte de escribiendo en mis API. La opción 2 requeriría que mis clientes también usaran Eigen, no para mencionar posibles problemas de compatibilidad si usaran una versión diferente de Eigen (dicho sea de paso, Eigen es una biblioteca de solo encabezado si importa eso ). Eso deja la opción 3.
¿Qué piensa la gente? ¿Básicamente respondí mi propia pregunta? ¿Hay algún ejemplo por ahí?
preguntas relacionadas
Una cuestión relacionada se le pidió here pero realmente no entró en detalles de si se debe exponer tipos externos.
¿Qué pasa con la opción 3, con constructores que toman las opciones 1 y 2? La semántica de C++ le permite reenviar tipos de declaraciones lo suficientemente bien para que esto funcione (los clientes sin Eigen aún pueden incluir el encabezado y no fallar en el momento de la compilación). – Lalaland
Estaba pensando en algo así, pero creo que estoy un poco confuso sobre cómo reenviar los tipos de plantilla typedef'd, aunque supongo que en mi caso probablemente limitaré a los clientes a pasar una instanciación específica de los tipos (como 'Quaternion' en comparación con 'Quaternion '). –
plasma
También estoy un poco confundido acerca de qué pasaría si un cliente usa el constructor para hacer que el tipo de mi biblioteca sea de su tipo Eigen, pero están usando una versión diferente de Eigen que, digamos, puede tener un ligero cambio de implementación. – plasma