#include <iostream>
#include <type_traits>
template <class T>
struct serialize_helper {
static void apply(T const&) { std::cout << "apply<T>" << std::endl; }
};
template <>
struct serialize_helper<std::string> {
static void apply(std::string const&) { std::cout << "apply<std::string>" << std::endl; }
};
template <class T, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr>
inline void serializer(const T& obj) {
serialize_helper<typename std::remove_pointer<T>::type>::apply(*obj);
}
template <class T, typename std::enable_if<!std::is_pointer<T>::value>::type* = nullptr>
inline void serializer(const T& obj) {
serialize_helper<T>::apply(obj);
}
int main() {
std::string s = "Hello";
std::string* p = new std::string("Hellp");
serializer(s);
serializer(p);
delete p;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IHNlcmlhbGl6ZV9oZWxwZXIgewoJc3RhdGljIHZvaWQgYXBwbHkoVCBjb25zdCYpIHsgc3RkOjpjb3V0IDw8ICJhcHBseTxUPiIgPDwgc3RkOjplbmRsOyB9Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3Qgc2VyaWFsaXplX2hlbHBlcjxzdGQ6OnN0cmluZz4gewoJc3RhdGljIHZvaWQgYXBwbHkoc3RkOjpzdHJpbmcgY29uc3QmKSB7IHN0ZDo6Y291dCA8PCAiYXBwbHk8c3RkOjpzdHJpbmc+IiA8PCBzdGQ6OmVuZGw7ICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZT46OnR5cGUqID0gbnVsbHB0cj4KaW5saW5lIHZvaWQgc2VyaWFsaXplcihjb25zdCBUJiBvYmopIHsKCXNlcmlhbGl6ZV9oZWxwZXI8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxUPjo6dHlwZT46OmFwcGx5KCpvYmopOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWU+Ojp0eXBlKiA9IG51bGxwdHI+CmlubGluZSB2b2lkIHNlcmlhbGl6ZXIoY29uc3QgVCYgb2JqKSB7CglzZXJpYWxpemVfaGVscGVyPFQ+OjphcHBseShvYmopOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6c3RyaW5nIHMgPSAiSGVsbG8iOwoJc3RkOjpzdHJpbmcqIHAgPSBuZXcgc3RkOjpzdHJpbmcoIkhlbGxwIik7CgkKCXNlcmlhbGl6ZXIocyk7CglzZXJpYWxpemVyKHApOwoJCglkZWxldGUgcDsKCXJldHVybiAwOwp9