fork download
  1. #include <type_traits>
  2. #include <iostream>
  3.  
  4. struct CByteArray {};
  5. struct NonPod {public: int a; private: int b;};
  6. struct HLVariant {
  7. HLVariant() {}
  8. HLVariant(const HLVariant&) {}
  9. HLVariant(const CByteArray&) {}
  10. HLVariant(const NonPod&) {}
  11. };
  12.  
  13. template <typename T>
  14. inline typename std::enable_if<std::is_same<T, HLVariant>::value && !std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
  15. {
  16. std::cout << "serialize non-pod variant\n";
  17. return CByteArray();
  18. }
  19.  
  20. template <typename T>
  21. inline typename std::enable_if<!std::is_same<T, HLVariant>::value && !std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
  22. {
  23. std::cout << "serialize non-pod non-variant\n";
  24. return serialize(HLVariant(value));
  25. }
  26.  
  27. template <typename T>
  28. inline typename std::enable_if<std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
  29. {
  30. std::cout << "serialize pod\n";
  31. return CByteArray();
  32. }
  33.  
  34.  
  35. int main()
  36. {
  37. std::cout << "int:\n";
  38. serialize(0);
  39. std::cout << "CByteArray:\n";
  40. serialize(CByteArray());
  41. std::cout << "HLVariant:\n";
  42. serialize(HLVariant());
  43. std::cout << "NonPod:\n";
  44. serialize(NonPod());
  45. }
  46.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
int:
serialize pod
CByteArray:
serialize pod
HLVariant:
serialize non-pod variant
NonPod:
serialize non-pod non-variant
serialize non-pod variant