¿Cómo emitir tipos genéricos que sé que son enteros?

Quiero verificar los códigos de retorno de las API de C de forma genérica y el resultado debe estar libre de tipos de C comolibc::c_int. ¿Hay alguna forma de escribir una función como

fn check<S: PartialOrd + std::num::Zero, T> (x: S) -> Option<T> {
    if std::num::zero::<S>() <= x { Some(x as T) }
    else { None }
}

cuando estoy seguro de queS yT son tipos integrales para todos los usos decheck()? El compilador rechaza mi código quejándoseerror: non-scalar cast: `S` as `T`

Respuestas a la pregunta(1)

Su respuesta a la pregunta