uses vector::base_type rather than heterogenous::common_base. this allows users to select their own base types