#include <iostream>
#include <utility>

template<typename T, typename = decltype(std::declval<T>().print_to(std::declval<std::ostream&>()))>
std::ostream &operator<<(std::ostream &s, const T &t) {
    t.print_to(s);
    return s;
}

struct foo {
    void print_to(std::ostream &s) const {
        s << "foo";
    }
};

int main() {
    std::cout << foo() << "\n";
}