Rust数组长度中使用泛型参数
caozhanhao
2024-09-16 0

这个问题比较奇怪,在C++中sizeof(T)是直接可以当作常量,作为数组长度的,但是在Rust中却报
generic parameters may not be used in const operations

解决方案来自Github上的一个issue

#![feature(generic_const_exprs)]

unsafe fn foo<T>(item: &T)
where [(); size_of::<T>()]:
{
    let raw: [u8; size_of::<T>()] = unsafe { transmute_copy(item) };
    // ...
}

注意:

  1. where必须有,否则编译器会报unconstrained generic constant
  2. 不能用transmute,因为编译器不知道[u8;size_of::<T>()]大小固定。

不过一般情况下,这种需求也可以用std::slice::from_raw_parts(item as *const _ as *const u8, size_of::<T>())来代替,这样可以避免一次复制,而且不需要features。

评论 0
没有评论
评论已关闭
发表评论
评论 取消回复
Copyright © 2024 mkfs