es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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…>

Tags:  , , , ,

Answer

  1. Avatar for 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 punteros void y el número de argumentos. Dentro del cuerpo de la función, utilizamos reinterpret_cast para convertir cada puntero void 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ón foo 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…>

Comments are closed.