以下内容仅用作示例,而不是有效的Rust代码.
struct Vec<T: Sized, Count> {
a: [T; Count]
}
Run Code Online (Sandbox Code Playgroud)
在C++模板中可能有类似的东西,但我还没有在Rust中看到它.
Rust语言是否支持类似于c ++方式的通用代码中的常量值?似乎语言概述不会宣传它.使用C++中的常量参数化类型允许根据客户端的需要(类似stlsoft :: auto_buffer)创建具有不同大小的预分配缓冲区的对象.
如果没有,那么在Rust中实现类似设计的最佳实践是什么?
我正在尝试将一些C++代码迁移到Rust.我尝试了很多不同的方法,但没有一个编译.
我想要一个可以处理不同类型的通用模板,并且具有可调整的总大小和静态字段(const表达式)Capacity:
template<class KeyType, class ValueType, int PageSize>
struct BplusTreeLeaf {
static const uint16_t Capacity = (PageSize-16)/(sizeof(KeyType)+sizeof(ValueType));
KeyType keys[Capacity];
ValueType values[Capacity];
};
Run Code Online (Sandbox Code Playgroud)
我想从外面访问容量:
for(int i = 0; i < BplusTreeLeaf<x, y, 4096>::Capacity; i ++) { ... }
Run Code Online (Sandbox Code Playgroud)
似乎在Rust中没有办法做这样的事情,或者至少在我对Rust的理解中:
static 在结构中是不允许的,文档告诉我使用宏这是我得到的:
macro_rules! BplusTreeLeaf {
($KeyType:ident, $ValueType:ident, $PageSize:expr) => {
static Capacity_: u16 = ($PageSize - 16) / (std::mem::size_of::<$KeyType>() + std::mem::size_of::<$ValueType>());
struct BplusTreeLeaf_ {
keys: [$KeyType, ..Capacity_],
values: [$ValueType, ..Capacity_],
}
}
}
BplusTreeLeaf!(u64, u64, 4096)
Run Code Online (Sandbox Code Playgroud)
编译器产生"向量长度的预期常量expr",这是不正确的,因为我没有使用"mut" Capacity_ …