#include <iostream>
#include <fstream>
#include <vector>
#include <string>
template<typename T>
struct serialize_helper
{
};
template<>
struct serialize_helper<std::string>
{
static void apply(const std::string& s, std::ofstream& res)
{
std::cout << s << std::endl;
}
};
template<typename T>
void serializer(const T& t, std::ofstream& res)
{
serialize_helper<T>::apply(t, res);
}
template<typename T>
void serializer(T* t, std::ofstream& res)
{
serialize_helper<T>::apply(*t, res);
}
int main()
{
std::ofstream res;
std::string s("reference");
serializer(s, res);
std::string* ps = new std::string("pointer");
serializer(ps, res);
delete ps;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3Qgc2VyaWFsaXplX2hlbHBlcgp7Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBzZXJpYWxpemVfaGVscGVyPHN0ZDo6c3RyaW5nPgp7CglzdGF0aWMgdm9pZCBhcHBseShjb25zdCBzdGQ6OnN0cmluZyYgcywgc3RkOjpvZnN0cmVhbSYgcmVzKQoJewoJCXN0ZDo6Y291dCA8PCBzIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIHNlcmlhbGl6ZXIoY29uc3QgVCYgdCwgc3RkOjpvZnN0cmVhbSYgcmVzKQp7CglzZXJpYWxpemVfaGVscGVyPFQ+OjphcHBseSh0LCByZXMpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIHNlcmlhbGl6ZXIoVCogdCwgc3RkOjpvZnN0cmVhbSYgcmVzKQp7CglzZXJpYWxpemVfaGVscGVyPFQ+OjphcHBseSgqdCwgcmVzKTsKfQoKaW50IG1haW4oKQp7CglzdGQ6Om9mc3RyZWFtIHJlczsKCXN0ZDo6c3RyaW5nIHMoInJlZmVyZW5jZSIpOwoJc2VyaWFsaXplcihzLCByZXMpOwoKCXN0ZDo6c3RyaW5nKiBwcyA9IG5ldyBzdGQ6OnN0cmluZygicG9pbnRlciIpOwoJc2VyaWFsaXplcihwcywgcmVzKTsKCWRlbGV0ZSBwczsKCglyZXR1cm4gMDsKfQ==