#include <type_traits>
#include <iostream>
struct CByteArray {};
struct NonPod {public: int a; private: int b;};
struct HLVariant {
HLVariant() {}
HLVariant(const HLVariant&) {}
HLVariant(const CByteArray&) {}
HLVariant(const NonPod&) {}
};
template <typename T>
inline typename std::enable_if<std::is_same<T, HLVariant>::value && !std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
std::cout << "serialize non-pod variant\n";
return CByteArray();
}
template <typename T>
inline typename std::enable_if<!std::is_same<T, HLVariant>::value && !std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
std::cout << "serialize non-pod non-variant\n";
return serialize(HLVariant(value));
}
template <typename T>
inline typename std::enable_if<std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
std::cout << "serialize pod\n";
return CByteArray();
}
int main()
{
std::cout << "int:\n";
serialize(0);
std::cout << "CByteArray:\n";
serialize(CByteArray());
std::cout << "HLVariant:\n";
serialize(HLVariant());
std::cout << "NonPod:\n";
serialize(NonPod());
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+CiAKc3RydWN0IENCeXRlQXJyYXkge307CnN0cnVjdCBOb25Qb2Qge3B1YmxpYzogaW50IGE7IHByaXZhdGU6IGludCBiO307CnN0cnVjdCBITFZhcmlhbnQgewoJSExWYXJpYW50KCkge30KCUhMVmFyaWFudChjb25zdCBITFZhcmlhbnQmKSB7fQoJSExWYXJpYW50KGNvbnN0IENCeXRlQXJyYXkmKSB7fQogCUhMVmFyaWFudChjb25zdCBOb25Qb2QmKSB7fQoJfTsKIAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KaW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxULCBITFZhcmlhbnQ+Ojp2YWx1ZSAmJiAhc3RkOjppc19wb2Q8VD46OnZhbHVlLCBDQnl0ZUFycmF5Pjo6dHlwZSBzZXJpYWxpemUoY29uc3QgVCYgdmFsdWUpCnsKCXN0ZDo6Y291dCA8PCAic2VyaWFsaXplIG5vbi1wb2QgdmFyaWFudFxuIjsKCXJldHVybiBDQnl0ZUFycmF5KCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgppbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxULCBITFZhcmlhbnQ+Ojp2YWx1ZSAmJiAhc3RkOjppc19wb2Q8VD46OnZhbHVlLCBDQnl0ZUFycmF5Pjo6dHlwZSBzZXJpYWxpemUoY29uc3QgVCYgdmFsdWUpCnsKCXN0ZDo6Y291dCA8PCAic2VyaWFsaXplIG5vbi1wb2Qgbm9uLXZhcmlhbnRcbiI7CglyZXR1cm4gc2VyaWFsaXplKEhMVmFyaWFudCh2YWx1ZSkpOwp9CiAKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmlubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3BvZDxUPjo6dmFsdWUsIENCeXRlQXJyYXk+Ojp0eXBlIHNlcmlhbGl6ZShjb25zdCBUJiB2YWx1ZSkKewoJc3RkOjpjb3V0IDw8ICJzZXJpYWxpemUgcG9kXG4iOwoJcmV0dXJuIENCeXRlQXJyYXkoKTsKfQogCiAKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgImludDpcbiI7CglzZXJpYWxpemUoMCk7CglzdGQ6OmNvdXQgPDwgIkNCeXRlQXJyYXk6XG4iOwoJc2VyaWFsaXplKENCeXRlQXJyYXkoKSk7CglzdGQ6OmNvdXQgPDwgIkhMVmFyaWFudDpcbiI7CglzZXJpYWxpemUoSExWYXJpYW50KCkpOwoJc3RkOjpjb3V0IDw8ICJOb25Qb2Q6XG4iOwoJc2VyaWFsaXplKE5vblBvZCgpKTsKfQo=