A simple yet decently performant variant implementation, divided between a Basic and Complex version explained below.
Basic: supports basic types like integers, floating points, C strings and non-complex objects (like C structs).
Complex: supports basic types and most custom/complex objects (requires a copy-constructor and a destructor), but is less memory-efficient.