I think it’s reasonable to avoid generating your own code if you can and remain performant. C++ needs it’s own (rather than wrapping C) so we can use std containers like std string and std vector without incurring additional copies. Also because meta programming with C++ is a bit challenging at the moment.
It might be possible to use things like string view and array view and/or class meta programming in the future to get rid of custom C++ messages, but for now it’s needed.
For python, we might be able to move away from generated code because the PyObject to C struct conversion happens anyway, but I think the generated c code helps with integration with Numpy but I could be wrong.
If you can just bind dynamically to the generated c structs we provide, without code generation that’s a good solution. Again so long as you can do so while minimizing or avoiding copies.