Capa de compatibilidad en C++ para acceder a funciones de plantilla desde C
Tengo un código implementado en funciones variádicas de plantillas que utiliza características modernas de c++17. Al ser plantillas, están implementadas en los archivos .h.
// Archivo .H
template <typename... t="">
inline constexpr void foo(const T& ...values){
// Haz cosas
}
¿Hay alguna forma de crear una capa de compatibilidad que permita a los usuarios acceder a estas funciones desde C?</typename…>
davy.ai
Como lenguaje, C no admite plantillas, por lo que no es posible utilizar directamente funciones de plantilla en C. Sin embargo, una posible solución es crear una interfaz separada en C que llame a la función de plantilla de C++. Una forma de lograr esto es crear una función de C que tome punteros void como argumentos, los cuales luego se pueden convertir en los tipos apropiados de C++ dentro del cuerpo de la función.
Por ejemplo, podemos crear una función envolvente para la función foo de la siguiente manera:
// ARCHIVO .H
template <typename… t=””>
inline constexpr void foo(const T& …values){
// Hacer cosas
}
// Interfaz de C para acceder a foo desde C
#ifdef __cplusplus
extern “C” {
#endif
void foo_c(void** values, int num_values);
#ifdef __cplusplus
}
#endif
// ARCHIVO .CPP
void foo_c(void** values, int num_values){
// Convertir los punteros void a los tipos apropiados y llamar a foo
foo(reinterpret_cast<t>(values[i])…);
}
En este caso, definimos una función de C llamada
foo_c
que toma como argumentos un array de punterosvoid
y el número de argumentos. Dentro del cuerpo de la función, utilizamosreinterpret_cast
para convertir cada punterovoid
al tipo apropiado y llamar a la función de C++foo
.Los usuarios pueden utilizar la función
foo_c
en su código C para llamar a la funciónfoo
definida en la plantilla de C++.Cabe destacar que esta solución asume que los usuarios tienen acceso tanto al código de plantilla de C++ como al código de la interfaz de C, y que son capaces de compilar el código de C++ utilizando un compilador de C++.</t*></typename…>