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.

¿Cómo detectar matrices multidimensionales de estilo C en la especialización de plantillas?

Tengo el siguiente código:

enum type_kind{unkown=-1,carray, multi_carray};

template<class t="">
struct detect_carray{
   constexpr static int kind=unkown;
};
template<class t,="" std::size_t="" n="">
struct detect_carray<t[n]>{
   constexpr static int kind=carray;
};

Ahora, quiero agregar otra especialización para detectar arreglos multidimensionales en estilo C, es decir, T[a][b]....

¿Cuál es la sintaxis para lograr esto? ¿Puedo utilizar plantillas variádicas?

Espero el comportamiento siguiente:

int main()
{
std::cout<<><><int>>::kind;//-1
std::cout<<><int[3]>::kind;//0
std::cout<<><double[3][5]>::kind;//1
std::cout<<><><double>[3][5][8][16]>::kind;//1
//Correct out: -1011
}
</double[3][5]></int[3]></t[n]>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar otra especialización para detectar matrices multidimensionales en estilo C, puedes usar plantillas variádicas. La sintaxis para lograr esto es la siguiente:

    template <typename t="">
    struct detect_carray {
      constexpr static int kind = -1;
    };
    
    template <typename t,="" std::size_t...="" dim="">
    struct detect_carray<t[dim]...> {
      constexpr static int kind =
          detect_carray<t[dim]...>::kind == -1 ? 1 : detect_carray<t[dim]...>::kind + 1;
    };
    

    En esta sintaxis, estás utilizando un enfoque recursivo con la ayuda de las plantillas variádicas. La primera especialización devuelve -1 como tipo de matriz, lo que significa que el tipo no es una matriz en estilo C. La segunda especialización utiliza una lista de argumentos de plantilla variádicos para manejar las múltiples dimensiones. La sintaxis T[dim] ... indica que la plantilla toma un número variable de argumentos, donde cada argumento es de la forma T[dim]. Luego, detect_carray se llama recursivamente para cada dimensión hasta que se alcanza la dimensión más profunda. Una vez que se alcanza la dimensión más profunda, kind se determina sumándole 1 al kind de la dimensión anterior.

    Con esta sintaxis, se logra el comportamiento esperado y la salida de la función principal debería ser -1011.</t[dim]…></t[dim]…></t[dim]…>

Comments are closed.