Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. ////////////////
  5.  
  6. template <class T, class = void>
  7. struct is_serializable : std::false_type {};
  8.  
  9. template <class T>
  10. struct is_serializable<T, std::enable_if_t<std::is_same_v<std::ostream, std::decay_t<decltype(operator<<(std::declval<std::ostream>(), std::declval<const T&>()))>>>> : std::true_type {};
  11.  
  12. template <class T>
  13. constexpr bool is_serializable_v = is_serializable<T>::value;
  14.  
  15. template <class ... Args>
  16. constexpr bool all_serializable_v = (is_serializable_v<Args> && ...);
  17.  
  18. ////////////////
  19.  
  20. template <class T, class = void>
  21. struct is_deserializable : std::false_type {};
  22.  
  23. template <class T>
  24. struct is_deserializable<T, std::enable_if_t<std::is_same_v<std::istream, std::decay_t<decltype(operator>>(std::declval<std::istream>(), std::declval<T&>()))>>>> : std::true_type {};
  25.  
  26. template <class T>
  27. constexpr bool is_deserializable_v = is_deserializable<T>::value;
  28.  
  29. template <class ... Args>
  30. constexpr bool all_deserializable_v = (is_deserializable_v<Args> && ...);
  31.  
  32. ////////////////
  33.  
  34. class A {};
  35.  
  36. std::ostream& operator<<(std::ostream& os, const A& a) { return os; }
  37. std::istream& operator>>(std::istream& os, A& a) { return os; }
  38.  
  39. template <class ... Args>
  40. void serialize(Args&&... args)
  41. {
  42.     static_assert(all_serializable_v<Args...>, "args must have operator<<");
  43.     // ...
  44. }
  45.  
  46. template <class ... Args>
  47. void deserialize(Args&&... args)
  48. {
  49.     static_assert(all_deserializable_v<Args...>, "args must have operator>>");
  50.     // ...
  51. }
  52.  
  53. int main()
  54. {
  55.     static_assert(is_serializable_v<int>);
  56.     static_assert(is_deserializable_v<std::string>);
  57.  
  58.     A a;
  59.     int b;
  60.     double c;
  61.  
  62.     serialize(a, b, c, 4, std::string(), A());
  63.     deserialize(a, b, c, 4, std::string(), A());
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement