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



我正试图编写一个宏来处理元组类型中的每种类型。元组类型从函数的泛型类型形参传递给宏。

fn print_type_ids<T:'static>() { my_macro!(T); }

print_type_ids::<(i32,f32,&str)>()应该打印3个不同的类型id。

但是当它作为泛型类型参数传递给宏时,我无法在Tuple Type中进行匹配。

我的代码:

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();

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)>();
}

从这里借用了一些代码

相关内容

  • 没有找到相关文章

最新更新