#include <iostream>

template<typename T>
inline int get_int(T const& in)
{
    std::cout << "In get_int!\n";
    return in;
}

inline int get_int(char const& in)
{
    std::cout << "In get_int(char)!\n";
    return static_cast<int>(in);
}

inline unsigned int get_int(unsigned char const& in)
{
    std::cout << "In get_int(unsigned char)!\n";
    return static_cast<unsigned int>(in);
}

template<typename T>
void go(T const& arg)
{
    auto result = get_int(arg);
    std::cout << "The integer is " << result << "\n";
}

int main()
{
    go(static_cast<unsigned char>('a'));
    go('a');
    go(42);
}
