【发布时间】:2014-10-24 11:08:02
【问题描述】:
我正在尝试将一些 C++ 代码迁移到 Rust。我尝试了很多不同的方法,但没有一个可以编译。
我想要一个通用模板,它可以处理不同的类型,并且具有可调整的总大小和静态字段(常量表达式)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];
};
我想从外部访问容量:
for(int i = 0; i < BplusTreeLeaf<x, y, 4096>::Capacity; i ++) { ... }
似乎在Rust中没有办法做这样的事情,或者至少在我对Rust的理解中:
-
static不允许在结构中使用,文档告诉我使用宏 - 在 Rust 中,只有类型可以“模板化”,而值或表达式则不能。我什至不能将总大小作为参数传递给结构定义
据我所知:
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)
编译器产生“向量长度的预期常量 expr”,这是不正确的,因为我没有对 Capacity_ 使用“mut”,所以它必须是一个 const 表达式。即使它可以工作,Capacity_ 和 BplusTreeLeaf_ 仍然会在全局范围/命名空间中。
我是否误解了 Rust 设计中的一些基本内容,或者这是不可能的?如果现在不可能,是否有计划作为未来的功能,还是我应该继续使用 C++ 11?
【问题讨论】:
-
是的,很多未实现的功能。编译器给出“expected constant expr”错误,因为 mem::size_of 是一个普通函数,它不是“constexpr”。 AFAIK,他们将在 1.0 之后的某个地方添加“constexpr”和“非类型模板参数”,并在 1.0 之前添加“静态成员”,使用此 RFC:github.com/rust-lang/rfcs/pull/195
-
我想我必须等待 :( 但是感谢 GitHub 问题的链接