https://danielsieger.com/blog/2024/08/02/cpp-opaque-pointer-pattern.html