fork(1) download
  1. #include <iostream>
  2. #include <string>
  3. #include <typeinfo>
  4. #include <unordered_map>
  5. #include <functional>
  6. #include <typeindex>
  7. #include <cassert>
  8.  
  9. class Renderer;
  10. struct Renderable { virtual ~Renderable() {} };
  11. struct SelfRenderable : Renderable {
  12. virtual void Render(Renderer& render) = 0;
  13. };
  14. class Renderer {
  15. public:
  16. std::unordered_map<std::type_index, std::function<void(Renderer& renderer, const Renderable& renderable)>> rendering_functions;
  17. void Render(Renderable& renderable) {
  18. if (rendering_functions.find(typeid(renderable)) != rendering_functions.end())
  19. return rendering_functions[typeid(renderable)](*this, renderable);
  20. if (auto self = dynamic_cast<SelfRenderable*>(&renderable))
  21. return self->Render(*this);
  22. assert(false);
  23. }
  24. template<typename T, typename F> void AddRenderingFunction(F f) {
  25. rendering_functions[typeid(T)] = [f](Renderer& renderer, const Renderable& renderable) {
  26. return f(renderer, static_cast<const T&>(renderable));
  27. };
  28. }
  29. void RenderText(std::string text) {
  30. std::cout << text;
  31. }
  32. };
  33. struct Player : Renderable {
  34. std::string name;
  35. };
  36. int main() {
  37. Renderer r;
  38. Player p;
  39. p.name = "Hello, World!";
  40. r.AddRenderingFunction<Player>([](Renderer& rend, const Player& p) {
  41. rend.RenderText(p.name);
  42. });
  43. r.Render(p);
  44. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
Hello, World!