Часто в различных консольных приложениях требуется вывести элементы контейнера или массива на консоль. А если соответствующий контейнер пустой, то вывести, например, фразу "is empty".
Написать такую обобщенную функцию в
C++ 17 стало довольно просто благодаря появлению новой обобщенной функции
std::empty, которую можно вызывать также и для массивов.
Ниже приведен пример использования новой обобщенной функции
std::empty в функции вывода элементов произвольного контейнера на консоль.
#include <iostream>
#include <iterator>
#include <array>
#include <vector>
template <typename Container>
std::ostream & output( const Container &container, std::ostream &os = std::cout )
{
if ( not std::empty( container ) )
{
for ( const auto &item : container )
{
os << item << ' ';
}
}
else
{
os << "is empty";
}
return os;
}
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
std::vector<int> v;
std::array<int, 0> arr1;
std::array<int, 5> arr2 = { 1, 2, 3, 4, 5 };
std::cout << "int a[]: ";
output( a ) << '\n';
std::cout << "std::vector<int>: ";
output( v ) << '\n';
std::cout << "std::array<int, 0>: ";
output( arr1 ) << '\n';
std::cout << "std::array<int, 5>: ";
output( arr2 ) << '\n';
}
Вывод программы на консоль:
int a[]: 1 2 3 4 5
std::vector<int>: is empty
std::array<int, 0>: is empty
std::array<int, 5>: 1 2 3 4 5
Можно выводимую фразу из тела функции перенести в список параметров функции. Например,
template <typename Container>
std::ostream & output( const Container &container,
const std::string_view &s = "is empty",
std::ostream &os = std::cout )
{
if ( not std::empty( container ) )
{
for ( const auto &item : container )
{
os << item << ' ';
}
}
else
{
os << s;
}
return os;
}