6个版本
0.1.5 | 2023年8月7日 |
---|---|
0.1.4 | 2023年8月1日 |
0.1.2 | 2023年7月31日 |
在过程宏中排名第687
每月下载量66次
13KB
138 行
Match Type
‖ Docs.rs ‖ Lib.rs ‖ Crates.io ‖
在编译时对表达式的类型进行匹配。
例如以下宏将根据输入表达式的类型展开为不同的String
表达式
struct A(i64,i32,i16,i8);
struct B(f64,f32,bool);
macro_rules! as_string {
($e:expr) => {
match_type!(
$e {
A => String: "It's an A :O".into(),
B => String: "B it is ^^".into(),
<T: Display> T => String: format!("{}", self),
<T: Debug> T => String: format!("{:?}", self),
_ => String: "<<Sad Monkey :(>>".into(),
}
)
}
}
或者这个宏将给出值的“相反数”,使用不同的操作取决于哪些被支持(在-
的情况下,如果两者都支持!
和-
)
macro_rules! opposite {
($e:expr) => {
match_type!(
$e {
<T: Neg> T => <T as Neg>::Output: -self,
<T: Not> T => <T as Not>::Output: !self,
}
)
};
}
请注意,不同匹配分支的右侧不必是同一类型。
性能
在至少opt-level
为1
的情况下,例如在默认的release
配置文件中,整个match_type
展开应该内联到汇编输出与直接编写匹配分支右侧相同。也就是说,match_type
应该没有生产运行时开销。
如何?
依赖
~260–710KB
~17K SLoC