2 pointsby akopich6 hours ago1 comment
  • akopich6 hours ago
    Author here. It started when I felt virtual functions and associated heap allocations are too expensive. Then I've realized std::any doesn't work for move-only types, let alone its SBO storage isn't configurable. Meanwhile microsoft/proxy does SBO only for trivial types. And there we go...

    Woid is an extremely customizable high-performance type-erasure header-only library. It provides containers like std::any, std::function and tools for non-intrusive polymorphism.

    Key features:

    - Performance

    - Value semantics

    - Move-only type support

    - Duck typing

    - Extreme customizability

    In my current benchmarks it outperforms std::any, std::function, inheritance-based polymorphism and some well-known libraries like function2, boost::te and microsoft/proxy.

    I want to make sure the comparison is fair, therefore, your advice on how to better tune the existing libraries is rather welcome.

      struct Square {
          double side;
          double area() const { return side * side; }
      };
      struct Shape : woid::InterfaceBuilder
                 ::Fun<"area", [](const auto& obj) -> double { return obj.area(); } >
                 ::Build {
          auto area() const { return call<"area">(); }
      };
      
      auto a = Shape{Square{1.5}}.area();
    And of course I'm here to answer your questions.