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);
}