rust 用于访问元组类型内部类型的宏,元组类型本身通过泛型类型参数传递

ijxebb2r  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在尝试写一个宏来处理元组类型中的每一个类型。元组类型是从函数的泛型类型参数传递给宏的。
例如
第一个月
print_type_ids::<(i32,f32,&str)>()应打印3个不同的类型ID。
但是当元组类型作为泛型类型参数传递给宏时,我无法在元组类型内部进行匹配。
我的代码到目前为止:

macro_rules! my_macro {
    ( ($($x:ty),+) ) => {
        {
            $(
                println!("{:?}",std::any::TypeId::of::<$x>());
            )+
        }
    };
}

fn print_type_ids<T:'static>() {
    my_macro!(T); //error, no match for this
}

fn main() {
    print_type_ids::<(i32,f32)>();

    my_macro!((i32,f32)); //works, prints twice, once for each type
}

我发现了两个例子,看起来它们应该能解决我的问题,但没能理解它们在做什么。
one from Serde

let (log, operation_state_id) = serde_json::from_slice::<(String, String)>(serialized_tuple.as_bytes()).unwrap();

second from rust-num

let t : (u32, u16) = num::Bounded::max_value();
9gm1akwq

9gm1akwq1#

macro_rules! my_macro2 {
    ($($x:ty,)* ) => {
        {
            $(
                println!("{:?}",std::any::TypeId::of::<$x>());
            )*
        }
    };
}

trait Happy {
    fn go();
}

macro_rules! tuple_impls {
    ( $head:ident, $( $tail:ident, )* ) => {
        impl<$head, $( $tail ),*> Happy for ($head, $( $tail ),*)
        where
            $head: 'static,
            $( $tail: 'static ),*
        {
            fn go() {
                my_macro2!($head, $( $tail, )*);
            }
        }

        tuple_impls!($( $tail, )*);
    };

    () => {};
}

tuple_impls!(A, B, C,D, E, F, G, H, I, J,);

fn print_type_ids<T:'static+Happy>() {
    T::go();
}

fn main() {
    print_type_ids::<(i32,f32,usize)>();
}

借了一些

相关问题