如何在Rust中检查一个类型是否为原始数据类型?(C++转Rust开发者寻求等效于std::is_fundamental的实现)
如何在Rust中判断类型是否为原始类型(类似C++的
std::is_fundamental) 作为从C++转Rust的开发者,我太懂你想要一个简洁方式判断类型是否属于原始类型的需求了!Rust标准库确实没有直接提供和std::is_fundamental完全对应的API,但我们有两种靠谱的解决方案:一种基于标准库手动实现,另一种用现成的第三方crate偷懒。
方案一:标准库自定义实现(无第三方依赖)
你可以通过自定义标记trait,配合宏批量为所有原始类型实现它,再写个辅助函数来完成判断。虽然要手动列举原始类型,但数量不多,宏能帮你简化代码:
// 定义标记trait,用于标识原始类型 pub trait IsPrimitive {} // 用宏批量为所有原始类型实现trait macro_rules! impl_primitive { ($($t:ty),*) => { $(impl IsPrimitive for $t {})* }; } // 列举Rust所有基础原始类型(可根据需求增减,比如加上裸指针/函数指针) impl_primitive!( bool, char, i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64, () ); // 辅助判断函数 pub fn is_primitive<T>() -> bool { // 利用函数重载特性:如果T实现了IsPrimitive,就调用第一个check,否则调用第二个 fn check<T: IsPrimitive>() -> bool { true } fn check<T>() -> bool { false } check::<T>() } // 测试你的示例场景 fn main() { assert!(is_primitive::<i32>()); assert!(!is_primitive::<Vec<u32>>()); assert!(!is_primitive::<MyStruct>()); assert!(!is_primitive::<(bool, f32)>()); } struct MyStruct;
这个方案完全依赖标准库,逻辑透明,能精准匹配你需要的判断规则。
方案二:用第三方crate快速实现
如果你不想手动写代码,可以用现成的is_primitive crate,它已经封装好了所有原始类型的判断逻辑。
首先在Cargo.toml中添加依赖:
[dependencies] is_primitive = "1.0"
然后直接调用即可:
use is_primitive::IsPrimitive; fn main() { assert!(i32::is_primitive()); assert!(!Vec::<u32>::is_primitive()); assert!(!MyStruct::is_primitive()); assert!(!(bool, f32).is_primitive()); } struct MyStruct;
这个方式省心省力,完全满足你的示例需求。
小补充
Rust的“原始类型”和C++std::is_fundamental的覆盖范围略有差异:
- 默认情况下,上面的方案包含数值类型、布尔值、字符、单元类型
(); - 如果你需要包含裸指针(
*const T/*mut T)或函数指针,只需在自定义方案的impl_primitive宏里加上对应的类型即可。
内容的提问来源于stack exchange,提问作者Matthew Pittenger
相关产品推荐
相关产品推荐

