fork(1) download
  1. #include <cassert>
  2. #include <type_traits>
  3. #include <iostream>
  4.  
  5. class CByteArray { public: CByteArray() {}};
  6.  
  7. class Variant {};
  8.  
  9. template<typename T>
  10. CByteArray serializePodType(const T&)
  11. {
  12. printf("serializePodType\n");
  13. return CByteArray();
  14. }
  15.  
  16. CByteArray serializeVariant(const Variant& v)
  17. {
  18. printf("serializeVariant\n");
  19. return CByteArray();
  20. }
  21.  
  22. template <typename T>
  23. typename std::enable_if<std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
  24. {
  25. return serializePodType(value);
  26. }
  27.  
  28. template <typename T>
  29. typename std::enable_if<std::is_convertible<T, Variant>::value && !std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
  30. {
  31. return serializeVariant(Variant(value));
  32. }
  33.  
  34. class ConvertibleToVariant : public Variant { virtual void foo(); };
  35.  
  36. struct POD {};
  37.  
  38. struct NonPOD { virtual void foo(); };
  39.  
  40. int main()
  41. {
  42. POD pod;
  43. ConvertibleToVariant ctv;
  44. //NonPOD nonpod;
  45.  
  46. const auto ctv_serialised = serialize(ctv);
  47. const auto pod_serialised = serialize(pod);
  48. //const auto nonpod_serialised = serialize(nonpod);
  49. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
serializeVariant
serializePodType