Напишите универсальную функцию печати для печати массива - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу задать два вопроса здесь:

  1. Чтобы сделать универсальную функцию печати , которая способна печатать массив (или вектор) любого типа данных (например, int), символ, строка и т. д.)
  2. Чтобы создать функцию печати, которая принимает входной массив (или вектор) объектов класса и вызывает функцию печати (уже присутствующую в определении класса)этого класса, чтобы напечатать содержимое каждого объекта.

Мне задали этот вопрос при размещении интервью для Zillingo.Сначала интервьюер задал мне вопрос 1, но после очень неудачной попытки он еще больше усложнил его и задал вопрос 2.

Решение, которое я дал для вопроса 1, состояло в том, что я сделаю Печать класс, который имеет несколько функций с именем print , но каждая принимает массив различных типов данных в качестве аргумента (одна функция для каждого существующего типа данных).Я был совершенно пуст после этого. :(

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Для 1 это выглядит следующим образом:

namespace printing {
  template<class T>
  void print(std::ostream& os, T const& t){
    os<<t;
  }
  template<class It>
  void print_range( std::ostream& os, It b, It e );

  template<class T,std::size_t N>
  void print( std::ostream& os, T const(&arr)[N] ){
    print_range(os, std::begin(arr), std::end(arr) );
  }

  template<class T,std::size_t N>
  void print( std::ostream& os, std::array<T, N> const& arr ){
    print_range(os, std::begin(arr), std::end(arr) );
  }
  template<class T, class A>
  void print( std::ostream& os, std::vector<T, A> const& arr ){
    print_range(os, std::begin(arr), std::end(arr) );
  }
  // etc

  template<class It>
  void print_range( std::ostream& os, It b, It e ){
    for(auto it=b; it!=e; ++it)
      print(os, *it);
  }
}

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

Для 2 запишите определение SFINAE для .print(std::ostream&) метод для обоих типов указателей и экземпляров (через decltype и -> и .).Затем напишите print перегрузку, которая работает только для ->print и .print -безопасных типов, и она будет лучше соответствовать версии os<<t;, но хуже, чем любая свободная функция print в пространстве имен типа.

Правильное выполнение занимает несколько десятков строк шаблонного шаблона, и я бы хотел несколько раз проверить порядок перегрузки в реальном компиляторе.В конце концов os<<t функция, вероятно, не будет вызываться print или не будет находиться в не детализированном пространстве имен.

0 голосов
/ 26 декабря 2018

Вы можете использовать функцию шаблона как,

#include <iostream>
#include <vector>
using namespace std;

template <class InputIterator>
void print(InputIterator start,InputIterator end)
{
    for(auto itr=start;itr!=end;++itr)
    {
        cout<<*itr<<" ";
    }
    cout<<endl;
}

int main() {
    int arr[]={1,2,3,4,5};
    print(std::begin(arr),std::end(arr));
    vector<int> in={1,2,6,7};
    print(in.begin(),in.end());
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...