fork download
  1. #include <string>
  2. #include <iostream>
  3. #include <type_traits>
  4.  
  5. template<typename T>
  6. class Traits
  7. {
  8. public: enum class Dummy{nothing};
  9. public: static Dummy const converter = Dummy::nothing;
  10. };
  11.  
  12. struct Printer
  13. {
  14. template<typename T>
  15. typename std::enable_if<!std::is_function<decltype(Traits<T>::converter)>::value, void>::type
  16. operator()(T const& object)
  17. {
  18. std::cout << object << std::endl;
  19. }
  20. template<typename T>
  21. typename std::enable_if<std::is_function<decltype(Traits<T>::converter)>::value, void>::type
  22. operator()(T const& object)
  23. {
  24. std::cout << Traits<T>::converter(object) << std::endl;
  25. }
  26. };
  27.  
  28. template<>
  29. class Traits<std::string>
  30. {
  31. public:
  32. static std::size_t converter(std::string const& object)
  33. {
  34. return object.size();
  35. }
  36. };
  37.  
  38. int main()
  39. {
  40. using namespace std::string_literals;
  41.  
  42. Printer p;
  43.  
  44. p(5);
  45. p("This is a C-string");
  46. p("This is a C++String"s); // This compiles.
  47. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
5
This is a C-string
19