// Example 7-4: Overloading functions and function templates.
#include <cctype>
#include <iomanip>
#include <iostream>
#include <ostream>
#include <string>
#include <vector>

template<typename T>
void print(const T& x)
{
  std::cout << x;
}

void print(char c)
{
  if (std::isprint(c))
    std::cout << c;
  else
    std::cout << std::hex << std::setfill('0')
              << "'\\x" << std::setw(2) << int(c) << '\''
              << std::dec;
}

template<>
void print(const long& x)
{
  std::cout << x << 'L';
}

int main()
{
  print(42L);    // calls print<long> specialization
  print('x');    // calls print(char) overload
  print('\0');   // calls print(char) overload
  print(42);     // calls print<int>
  print(std::string("y")); // calls print<string>
  print();                   // Error: argument required
  print(std::vector<int>()); // Error
}
