About enum match arms

About enum's arms match, is there a better way to get variables

pub trait A: Into<AImpl> { 
    type Item<'a>: Scalar<'a> where Self: 'a;
}
pub enum AImpl {
    Int8(P),  // P impl trait A
    Int16(D), // D impl trait A
   //20 Item
}

fn func<'a, T1: A, T2: A, T3: A, T4: A>(a: &'a T1, b: &'a T2, c: &'a T3, d: &'a T4) {
    
}
//
// There is a better way??
//
fn call_func(a:AImpl,b:AImpl,c:AImpl,d:AImpl ) {
    match (a,b,c,d) {
        (  AImpl::Int8(v1),AImpl::Int8(v2),AImpl::Int8(v3),AImpl::Int8(v4),) => {
            func( v1,v2,v3,v4)
        }
       ... //30000 match
    }
}

Maybe something like this can help.

impl AImpl {
    fn into_inner(self) -> Box<dyn A> {
        match self {
            Int8(p) => Box::new(p),
            Int16(d) => Box::new(d),
            // ...
        }
    }
}

Can you please further detail what you want to do and what your problem is?

What are P and D? Can they be converted to a single type?