LINUX.ORG.RU

Вывод в поток «многомерного» Array

 


0

2

Помогите решить задачу:

Шаблонный класс Array может хранить объекты любого типа, для которого определён конструктор копирования, в том числе и другой Array, например, Array< Array<int> >. Глубина вложенности может быть произвольной. Напишите шаблонную функцию (или несколько) flatten, которая принимает на вход такой «многомерный» Array неизвестной заранее глубины вложенности и выводит в поток out через пробел все элементы, хранящиеся на самом нижнем уровне. Примеры работы функции flatten:

Array<int> ints(2, 0);
ints[0] = 10;
ints[1] = 20;
flatten(ints, std::cout); // выводит на экран строку "10 20"
Array< Array<int> > array_of_ints(2, ints);
flatten(array_of_ints, std::cout); // выводит на экран строку "10 20 10 20"
Array<double> doubles(10, 0.0);
flatten(doubles, std::cout); // работать должно не только для типа int

Note: лидирующие и завершающие пробельные символы будут игнорироваться проверяющей системой, т. е. там где ожидается «10 20» будет так же принят, например, вариант " 10 20 ", но не вывод «1020».

Hint: шаблонные функции тоже можно перегружать, из нескольких шаблонных функций будет выбрана наиболее специфичная.

#include <iostream>


// Весь вывод должен осущствляться в поток out,
// переданный в качестве параметра.
//
// Можно заводить любые вспомогаетльные функции,
// структуры или даже изменять сигнатуру flatten,
// но при этом все примеры вызова из задания должны
// компилироваться и работать.

template <typename T>
void flatten(const Array<T>& array, std::ostream& out)
{ }

Пока завис на этом:

template <typename T>
  void flatten(const Array<T>& array, std::ostream& out)
  {
      if (typeid(Array<int>)==typeid(T) || typeid(Array<double>)==typeid(T)){
          // тут наверное надо рекурсивно вызывать flatten(array[i], out)
          // но так не выходит
      } else {
      for (int i=0; i<array.size(); ++i)
          out << array[i] << " ";
      }
  }
Может есть какие то стандартные способы развернуть такой Array?

★★

Запомни: если ты решаешь проблему в C++ через RTTI, ты решаешь её неправильно.

Тебе нужна явная специализация шаблонной функции для примитивных типов (double/int/...).

// Откуда задания? Для вузовских довольно неплохой уровень.

E ★★★
()
Ответ на: комментарий от pascal

Подтолкните вы меня на правильное решение? Так мало времени до до окончания всех сроков. Обидно будет не успеть :(

anonymous
()
Ответ на: комментарий от anonymous

В первом посте отличная подсказка.

Pirr ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.