jei*_*iea 1 arrays constant-expression rust dependent-type
我想将以下C++代码重写为Rust:
using storage = array<int, 3>;
const size_t storage_len = sizeof(storage) / sizeof(storage::value_type);
Run Code Online (Sandbox Code Playgroud)
如何在没有具体变量的情况下获得恒定长度值?
作为动机,尽管看起来似乎微不足道,但我想在不声明变量的情况下打印数组的元素数.我知道我可以使用常量值或声明一个虚拟变量,但我想知道Rust如何保存C++代码.
我承认没有具体变量尚不清楚.我想实现上述C++功能,但这种解释可能会产生误导.我很好奇是否有任何方法可以获得数组的元素类型.
我知道你只想从类型信息中检索数组长度.Rust没有内置的PI类型(又名const泛型).这意味着该语言当前不支持非类型的通用参数(如数组长度的整数).
有一个跟踪此问题的问题,我们可能会在未来看到对它的支持,尽管不是在不久的将来.
如果必须,您可以通过为每种类型实现特征来解决该限制:
trait GetLength {
fn len() -> usize;
}
impl<T> GetLength for [T; 0] {
fn len() -> usize {
0
}
}
impl<T> GetLength for [T; 1] {
fn len() -> usize {
1
}
}
// ...
fn main() {
println!("{}", <[String; 1]>::len());
}
Run Code Online (Sandbox Code Playgroud)
宏可以帮助防止重复输入:
trait GetLength {
fn len() -> usize;
}
macro_rules! impl_get_length {
($v:expr) => {
impl<T> GetLength for [T; $v] {
fn len() -> usize {
$v
}
}
};
}
impl_get_length!{ 0 }
impl_get_length!{ 1 }
// ...
fn main() {
println!("{}", <[String; 1]>::len());
}
Run Code Online (Sandbox Code Playgroud)
Crates typenum也有助于为现有语言中的const泛型提供一些支持.
在Rust中,您可以获得类型的大小std::mem::size_of,因此您可以使用与C++相同的方式获取数组类型的长度:
use std::mem::size_of;
type Storage = [i32; 3];
fn main() {
println!("Length: {}", size_of::<Storage>() / size_of::<i32>());
}
Run Code Online (Sandbox Code Playgroud)
但是,这需要知道存储在数组中的项目类型.我不知道如何在不实例化变量的情况下获得它.
| 归档时间: |
|
| 查看次数: |
592 次 |
| 最近记录: |