C++ Шаблонные функции

Я хочу написать универсальную функцию которая будет уметь выводить как одномерные так и двумерные массивы. Для этого использую шаблоны, все было окей пока не начал выводить двумерные массивы. Для определения типа переданного параметра использую typeid, но компилятор упорно не дает мне выводить двумерные и одномерные массивы в одной функции, помогите разобраться в чем проблема. Мой код:

#include <iostream>
#include <string>



template <class T>
void printToConcole(T showingParam) {

    std::cout << (typeid(showingParam).name()) << std::endl;
    if (typeid(showingParam) == typeid(int)) {
        std::cout << showingParam << std::endl;
    }
    else if(typeid(showingParam) == typeid(double)) {
        std::cout << showingParam << std::endl;

    }
    else if (typeid(showingParam) == typeid(int*)) {
        for (size_t i = 0; i <= sizeof(showingParam) / sizeof(int); i++)
        {
            if (i== sizeof(showingParam) / sizeof(int)) {
                std::cout << showingParam[i] << std::endl;
                continue;
            }
            std::cout << showingParam[i] << '\t';
        }
    }
    else if (typeid(*showingParam) == typeid(int[sizeof(*showingParam)])) {
        for (size_t i = 0; i <= sizeof(showingParam) / sizeof(int); i++)
        {
            for (size_t j = 0; j <= sizeof(showingParam[i]) / sizeof(int); j++)
            {
            if (j == sizeof(showingParam[i]) / sizeof(int)) {
                std::cout << showingParam[i][j] << std::endl;
                continue;
            }
            std::cout << showingParam[i][j] << '\t';
            }
        }
    }
    
}


int main()
{
    
    int a[3] =  {4, 5, 6};
    printToConcole(a);
}

Ошибки компилятора:

prog.cpp(33,1): error C2109: для индекса требуется массив или указатель
prog.cpp(36,1): error C2109: для индекса требуется массив или указатель

Ответы (1 шт):

Автор решения: Александр Арсеньев

Решил сам, может кому пригодится. Ответ был в следующем, необходимо явное преобразование типов и все работает.

#include <iostream>
#include <string>

void printIntArray(int * arr ){
    for (size_t i = 0; i <= sizeof(arr) / sizeof(int); i++)
    {
        if (i == sizeof(arr) / sizeof(int)) {
            std::cout << arr[i] << std::endl;
            continue;
        }
        std::cout << arr[i] << '\t';
    }
}






template <class T>
void printToConcole(T showingParam) {


    if (typeid(showingParam) == typeid(int)) {
        std::cout << showingParam << std::endl;
    }
    else if(typeid(showingParam) == typeid(double)) {
        std::cout << showingParam << std::endl;

    }
    else if ( typeid(showingParam) == typeid(int*) )
    {

        printIntArray((int*)showingParam);
        
    }
    else if (typeid(*showingParam) == typeid(int[sizeof(*showingParam) / sizeof(int)])) {
        for (size_t i = 0; i <= sizeof(showingParam) / sizeof(int); i++)
        {
            printIntArray((int*)showingParam[i]);
        }
        
    }
    
}


int main()
{
    
    int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
    printToConcole(a);
}
→ Ссылка