#include <string>
#include <iostream>
#include <type_traits>
template<typename T>
class Traits
{
public: enum class Dummy{nothing};
public: static Dummy const converter = Dummy::nothing;
};
struct Printer
{
template<typename T>
typename std::enable_if<!std::is_function<decltype(Traits<T>::converter)>::value, void>::type
operator()(T const& object)
{
std::cout << object << std::endl;
}
template<typename T>
typename std::enable_if<std::is_function<decltype(Traits<T>::converter)>::value, void>::type
operator()(T const& object)
{
std::cout << Traits<T>::converter(object) << std::endl;
}
};
template<>
class Traits<std::string>
{
public:
static std::size_t converter(std::string const& object)
{
return object.size();
}
};
int main()
{
using namespace std::string_literals;
Printer p;
p(5);
p("This is a C-string");
p("This is a C++String"s); // This compiles.
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBUcmFpdHMKewogICAgcHVibGljOiBlbnVtIGNsYXNzIER1bW15e25vdGhpbmd9OwogICAgcHVibGljOiBzdGF0aWMgRHVtbXkgY29uc3QgY29udmVydGVyID0gRHVtbXk6Om5vdGhpbmc7Cn07CgpzdHJ1Y3QgUHJpbnRlcgp7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfZnVuY3Rpb248ZGVjbHR5cGUoVHJhaXRzPFQ+Ojpjb252ZXJ0ZXIpPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCiAgICBvcGVyYXRvcigpKFQgY29uc3QmIG9iamVjdCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgb2JqZWN0IDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Z1bmN0aW9uPGRlY2x0eXBlKFRyYWl0czxUPjo6Y29udmVydGVyKT46OnZhbHVlLCB2b2lkPjo6dHlwZQogICAgb3BlcmF0b3IoKShUIGNvbnN0JiBvYmplY3QpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IFRyYWl0czxUPjo6Y29udmVydGVyKG9iamVjdCkgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKdGVtcGxhdGU8PgpjbGFzcyBUcmFpdHM8c3RkOjpzdHJpbmc+CnsKICAgIHB1YmxpYzoKICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QgY29udmVydGVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBvYmplY3QpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0LnNpemUoKTsKICAgICAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKCiAgICBQcmludGVyICAgICBwOwoKICAgIHAoNSk7CiAgICBwKCJUaGlzIGlzIGEgQy1zdHJpbmciKTsKICAgIHAoIlRoaXMgaXMgYSBDKytTdHJpbmcicyk7ICAvLyBUaGlzIGNvbXBpbGVzLgp9