using is_base_of for less sfinae