¿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()
</double[3][5]></int[3]></t[n]>
{
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
}
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:
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 formaT[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 alkind
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]…>