Оператор перегрузки << для массива без необходимости использования класса - PullRequest
1 голос
/ 13 мая 2019

У меня есть вопрос. в C ++ я могу перегрузить operator<<, чтобы я мог напечатать массив заданного размера, без необходимости использования класса? Мне удалось напечатать массив, но только если я сделал этот массив членом класса.

Ответы [ 2 ]

4 голосов
/ 13 мая 2019

Да, конечно, вы можете сделать это.

Просто продолжайте и определите перегрузку этого оператора, чтобы он брал все, что вы хотите. Это не обязательно должен быть тип класса.

Итак, как-то так:

template <typename T, std::size_t N>
std::ostream& operator<<(std::ostream& os, const T (&arr)[N])
{
   for (const auto& el : arr)
      os << el << ' ';

   return os;
}

( живое демо )

Тем не менее, я предостерегаю от этого за борт; другие программисты, использующие ваш код, вероятно, не ожидают этого, и не так много других типов, не относящихся к классам, которые еще не имеют подобных перегрузок (учтите, что все целые числа, char типы, bool и указатели уже "сделай что-нибудь", когда потоком).


Полный демонстрационный код для потомков:

#include <iostream>
#include <cstddef>

template <typename T, std::size_t N>
std::ostream& operator<<(std::ostream& os, const T (&arr)[N])
{
   for (const auto& el : arr)
      os << el << ' ';

   return os;
}

int main()
{
    int array[] = {6,2,8,9,2};
    std::cout << array << '\n';
}

// Output: 6 2 8 9 2
1 голос
/ 13 мая 2019

Еще один способ сделать это с std::copy и std::ostream_iterator

#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstddef>

template <typename T, auto N>
auto& operator<<(std::ostream& os, T(&arr)[N])
{
  std::copy(std::cbegin(arr), std::cend(arr), std::ostream_iterator<T>(os, " "));
  return os;
}

int main()
{
    int array[] = { 6, 2, 8, 9, 2};
    std::cout << array << '\n';
}

// Output: 6 2 8 9 2
...