Well my personal favorite is a single access object something like `std::map<std::pair<mat, std::pair<mf, mt> >, mt_base_struct* >` (I think this is what is required for uniqueness) and then do the memory management by hand and use dynamic casts but an API for that is hard. One could use the same map structure per endf datatype and concrete structs like `std::map<std::pair<mat, std::pair<mf, mt> >, mt_xxx_struct >` which would make lookups much faster once a library becomes large but the cython API would still be much more complex.