use enable_if instead of tag dispatch