wrapper_object.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. //
  2. // wrapper_object.hpp
  3. // logging
  4. //
  5. // Created by Sam Jaffe on 4/4/19.
  6. //
  7. #pragma once
  8. #include <iostream>
  9. #include <string>
  10. #include "detail/to_string.h"
  11. #include "detail/to_json.h"
  12. namespace logging { namespace detail {
  13. class object {
  14. public:
  15. template <typename T> explicit object(T & object);
  16. private:
  17. friend std::ostream & operator<<(std::ostream & os, object const & obj) {
  18. return os << obj.to_string_(obj.ptr_);
  19. }
  20. template <typename> static std::string to_string_impl(void * ptr);
  21. template <typename> static json to_json_impl(void * ptr);
  22. private:
  23. void * ptr_;
  24. std::string (*to_string_)(void*);
  25. json (*to_json_)(void*);
  26. };
  27. template <typename T>
  28. std::string object::to_string_impl(void * ptr) {
  29. return to_string(*static_cast<T*>(ptr));
  30. }
  31. template <typename T>
  32. json object::to_json_impl(void * ptr) {
  33. return to_json(*static_cast<T*>(ptr));
  34. }
  35. template <typename T>
  36. object::object(T & object)
  37. : ptr_(&object),
  38. to_string_(&object::to_string_impl<T>),
  39. to_json_(&object::to_json_impl<T>) {
  40. }
  41. } }