#include <iostream>
#include <vector>
#include <string>
template <typename M, typename T> void process(M&, T&);
template <typename M, typename T> void process_impl(M& m, const T& t) { m.write(t); }
template <typename M, typename T> void process_impl(M& m, const std::vector<T>& v)
{
for(const auto& t : v) {
process(m, t);
}
}
template <typename M, typename T> void process(M& m, const T& t) { process_impl(m, t); }
struct media
{
template <typename T> void write(const T& t) { std::cout << t << std::endl; }
};
void process(media& m, const std::string& s) { process(m, s.size()); }
template <typename M> struct debug_media
{
template <typename T> void write(const T& t) { m.write(t); }
media m;
};
template <typename M, typename T> void process(debug_media<M>& d, const T& t)
{
std::cout << "debug: ";
process(d.m, t);
}
template <typename M, typename T> void process(debug_media<M>& d, const std::vector<T>& v)
{
for(const auto& t : v) {
process(d, t);
}
}
int main()
{
{
media m;
process(m, std::vector<std::string>{ "1", "22" });
}
{
debug_media<media> m;
process(m, std::vector<std::string>{ "1", "22" });
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPHR5cGVuYW1lIE0sIHR5cGVuYW1lIFQ+IHZvaWQgcHJvY2VzcyhNJiwgVCYpOwoKdGVtcGxhdGUgPHR5cGVuYW1lIE0sIHR5cGVuYW1lIFQ+IHZvaWQgcHJvY2Vzc19pbXBsKE0mIG0sIGNvbnN0IFQmIHQpIHsgbS53cml0ZSh0KTsgfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgTSwgdHlwZW5hbWUgVD4gdm9pZCBwcm9jZXNzX2ltcGwoTSYgbSwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYpCnsKICAgIGZvcihjb25zdCBhdXRvJiB0IDogdikgewogICAgICAgIHByb2Nlc3MobSwgdCk7CiAgICB9Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBNLCB0eXBlbmFtZSBUPiB2b2lkIHByb2Nlc3MoTSYgbSwgY29uc3QgVCYgdCkgeyBwcm9jZXNzX2ltcGwobSwgdCk7IH0KCnN0cnVjdCBtZWRpYQp7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCB3cml0ZShjb25zdCBUJiB0KSB7IHN0ZDo6Y291dCA8PCB0IDw8IHN0ZDo6ZW5kbDsgfQp9Owp2b2lkIHByb2Nlc3MobWVkaWEmIG0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHByb2Nlc3MobSwgcy5zaXplKCkpOyB9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4gc3RydWN0IGRlYnVnX21lZGlhCnsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHdyaXRlKGNvbnN0IFQmIHQpIHsgbS53cml0ZSh0KTsgfQoKICAgIG1lZGlhIG07Cn07CnRlbXBsYXRlIDx0eXBlbmFtZSBNLCB0eXBlbmFtZSBUPiB2b2lkIHByb2Nlc3MoZGVidWdfbWVkaWE8TT4mIGQsIGNvbnN0IFQmIHQpCnsKICAgIHN0ZDo6Y291dCA8PCAiZGVidWc6ICI7CiAgICBwcm9jZXNzKGQubSwgdCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBNLCB0eXBlbmFtZSBUPiB2b2lkIHByb2Nlc3MoZGVidWdfbWVkaWE8TT4mIGQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2KQp7CiAgICBmb3IoY29uc3QgYXV0byYgdCA6IHYpIHsKICAgICAgICBwcm9jZXNzKGQsIHQpOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHsKICAgICAgICBtZWRpYSBtOwogICAgICAgIHByb2Nlc3MobSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyAiMSIsICIyMiIgfSk7CiAgICB9CiAgICB7CiAgICAgICAgZGVidWdfbWVkaWE8bWVkaWE+IG07CiAgICAgICAgcHJvY2VzcyhtLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ICIxIiwgIjIyIiB9KTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==