template <typename T>
std::string toString(T const & t) {
ostringstream out;
out << t;
return out.str();
}
template <>
std::string toString(char const* const & s) {
cout << "(S1)";
return std::string(s);
}
template <size_t N>
std::string toString(char (&s)[N]) {
cout << "(S2)";
return std::string(s);
}
template <size_t N>
std::string toString(char const (&s)[N]) {
cout << "(S3)";
return std::string(s);
}
int main() {
const char* s1 = "Hi";
cout << toString(s1) << endl;
char s2[] = "There";
cout << toString(s2) << endl;
cout << toString(", Bob") << endl;
}