#include <iostream>
template <typename stream, typename type> void serialize(stream&, type&)
{
std::cout << "Came to 1\n";
}
struct stream
{
void serialize(int ) {}
};
// struct foo
struct foo {
int bar;
};
// serialize foo
template <class stream> void serialize(stream& s, foo& f) {
std::cout << "Came to 2\n";
s.serialize(f.bar);
}
struct bar {
};
int main()
{
// ...later in source file:
foo f;
stream s;
serialize(s, f);
bar b;
serialize(s, b);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIHN0cmVhbSwgdHlwZW5hbWUgdHlwZT4gdm9pZCBzZXJpYWxpemUoc3RyZWFtJiwgdHlwZSYpCnsKICAgc3RkOjpjb3V0IDw8ICJDYW1lIHRvIDFcbiI7Cn0KCnN0cnVjdCBzdHJlYW0KewogICB2b2lkIHNlcmlhbGl6ZShpbnQgKSB7fQp9OwoKLy8gc3RydWN0IGZvbwpzdHJ1Y3QgZm9vIHsKICAgIGludCBiYXI7Cn07CgovLyBzZXJpYWxpemUgZm9vCnRlbXBsYXRlIDxjbGFzcyBzdHJlYW0+IHZvaWQgc2VyaWFsaXplKHN0cmVhbSYgcywgZm9vJiBmKSB7CiAgIHN0ZDo6Y291dCA8PCAiQ2FtZSB0byAyXG4iOwogICBzLnNlcmlhbGl6ZShmLmJhcik7Cn0KCnN0cnVjdCBiYXIgewp9OwoKaW50IG1haW4oKQp7CiAgIC8vIC4uLmxhdGVyIGluIHNvdXJjZSBmaWxlOgogICBmb28gZjsKICAgc3RyZWFtIHM7CiAgIHNlcmlhbGl6ZShzLCBmKTsKICAgYmFyIGI7CiAgIHNlcmlhbGl6ZShzLCBiKTsKfQoK