Listing 2

template<typename T>
struct addition_traits
{
   typedef T const &type;
};
struct addition_traits<char> { typedef char type; };
struct addition_traits<char const> { typedef char const type; };
struct addition_traits<char *> { typedef char * type; };
struct addition_traits<char const *> { typedef char const * type; };