Why projects use pointers to objects of their most massive data type,
and what alternatives to suggest?
If it is dynamic polymorphism then there is boost::base_collection
to consider.
If it is need for more control over life-time of single objects
then there are std::optional and std::variant to consider.
If it is need for sorting then there is boost::intrusive::set
to consider.
If it is because that way was easier to mock for unit testing,
then .. huh, consider trying more.
If it is because of desire to have our most massively used type
opaque then ... huh, consider dropping that stupid idea.