A C++23 library for building type-erasing wrappers.
#include "any/any.hpp"
#include <cassert>
#include <cstdio>
// "abstract" interfaces:
template <class Model>
struct idrawable : any::interface<idrawable, Model>
{
using idrawable::interface::interface;
constexpr virtual void draw() const
{
any::value(*this).draw();
}
};
namespace my
{
// A concrete type that models the interface but
// that does not inherit from it:
struct drawable
{
void draw() const
{
std::printf("my::drawable::draw()\n");
}
};
} // namespace my
int main()
{
any::any<idrawable> widget = my::drawable{};
// prints "my::drawable::draw()":
widget.draw();
}