struct Drawable {
void draw(std::ostream &out) const {
te::call([](auto const &self, auto &out) { self.draw(out); }, *this, out);
}
};
struct Square {
void draw(std::ostream &out) const { out << "Square"; }
};
int main() {
Square s;
te::poly<Drawable> d{s};
d.draw(std::cout);
return 0;
}