Cómo imprimir dimensiones de una array multidimensional en C++

Cree una función que imprima el tamaño de una array multidimensional por dimensiones, es decir:
Ejemplos: 
 

Input : 
int a[2][3][4];
printDimensions(a);
Output :
2x3x4

Input :
int b[5][6];
printDimensions(a);
Output :
5x6

Para resolver este problema, debemos usar la función de plantilla para calcular el tamaño de la array actual. Luego llamamos a esta función recursivamente hasta la última dimensión. Para la última dimensión, se debe utilizar la función de plantilla anulada de límite. La implementación de la idea:
 

CPP

// C++ program to print dimensions of a
// multidimensional array
#include <iostream>
 
template <typename T, size_t N>
void printDimensions(const T (&a)[N])
{
    std::cout << N;
}
 
template <typename T, size_t N, size_t M>
void printDimensions(const T (&a)[N][M])
{
    std::cout << N << "x";
    printDimensions(a[0]);
}
 
int main()
{
    int a[2][3][4];
    printDimensions(a);
    return 0;
}
Producción: 

2x3x4

 

Preste atención al orden de las dos funciones de plantilla. No se compilará si los cambia.
Hay una forma más de obtener los mismos resultados mediante el uso de funciones de plantilla de idioma:
 

CPP

// C++ 14 program to print dimensions of a
// multidimensional array
#include <iostream>
#include <type_traits>
 
template <typename T>
std::enable_if_t<std::rank<T>::value == 1>
printDimensions(const T& a)
{
    std::cout << std::extent<T>::value;
}
 
template <typename T>
std::enable_if_t<std::rank<T>::value != 1>
printDimensions(const T& a)
{
    std::cout << std::extent<T>::value << "x";
    printDimensions(a[0]);
}
 
int main()
{
    int a[2][3][4];
    printDimensions(a);
    return 0;
}
Producción: 

2x3x4

 

Si cree que los nombres de las plantillas son demasiado largos para imprimirlos, no está solo. Hay alias cortos en C++17: 
std::extent_v para std::extent::value y std::rank_v para std::rank::value
 

Publicación traducida automáticamente

Artículo escrito por greenEkatherine y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *