Firmas de múltiples tipos de C++ N-API
Estoy aprendiendo C++ y experimentando con OpenCV
y node-addon-api
. Quería crear mi propio envoltorio para cv::Vec
. docs
<h1>include <napi.h></h1>
<h1>include <opencv2/core/matx.hpp></h1>
class Vec : public Napi::ObjectWrap<Vec> {
public:
static Napi::Object Init(Napi::Env env, Napi::Object exports);
explicit Vec(const Napi::CallbackInfo &info);
private:
static Napi::FunctionReference constructor;
//
// no type named 'Vec' in namespace 'cv';
// I would like this to be cv::Vec2 or cv::Vec3 ... of any type
cv::Vec *<em>wrappedClass</em>;
// duplicate member '<em>wrappedClass</em>'
// cv::Vec2 *<em>wrappedClass</em>;
// cv::Vec3 *<em>wrappedClass</em>;
};
Por supuesto, el ejemplo anterior no funcionará porque cv::Vec
espera que especifique el type
y el size
. Entonces, algo como esto: cv::Vec<int, 3>
funcionaría y crearía un vector tridimensional.
Mi pregunta es cómo sobrecargar correctamente el constructor y definir el tipo _wrappedClass_
.
¿Debo crear clases Vec2
, Vec3
, y así sucesivamente, que extiendan la clase actual Vec
?
Cuando miré cómo los desarrolladores más experimentados abordaban el problema, encontré este ejemplo en opencv4nodejs. Parece más razonable:
- 1 archivo cpp
- archivo de encabezado base
- archivos de encabezado adicionales para las variantes de clase
Tengo un ejemplo completo en GitHub aquí.
davy.ai
Para la sobrecarga adecuada del constructor y para definir el tipo
_wrappedClass_
, se pueden utilizar plantillas para crear una clase genéricaVec
. Luego, se pueden crear clases específicasVec2
,Vec3
, etc. que heredan de la clase genéricaVec
, especificando el tamaño y el tipo en los argumentos de la plantilla.Aquí hay un ejemplo de implementación:
Con esta implementación, se puede crear una clase específica como
Vec2f
que herede de la clase genéricaVec<2, float>
, por ejemplo. También se pueden agregar clases especializadas adicionales según sea necesario.Para utilizar esta implementación, se puede incluir el archivo de encabezado que define las clases
Vec
especializadas que se necesitan y llamar al métodoInit
para crear la claseVec
y agregarla a los exports:“`cpp
// Incluye las clases Vec especializadas
#include “Vec2f.h”
#include “Vec3i.h”
Napi::Object Init(Napi::Env env, Napi::Object exports) {
// Agregar las clases Vec especializadas a los exports
Vec2f::Init(env, exports);
Vec3i::Init(env, exports);
// Repetir para otras clases Vec especializadas según sea necesario
return exports;
}
“`</size,></size,></size,></size,></size,></size,></size,></size,></napi.h>