首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在Rust中提供一组具有单个类型参数的相关类型吗?

我可以在Rust中提供一组具有单个类型参数的相关类型吗?
EN

Stack Overflow用户
提问于 2019-04-22 03:08:13
回答 1查看 170关注 0票数 4

我正在开发一个库,它可以处理32位和64位架构的PE文件。一些结构将引用虚拟地址(VA,例如ImageBase)和相对虚拟地址(RVA,例如段偏移量),例如:

代码语言:javascript
复制
type VA32 = u32;
type RVA32 = i32;

struct Header32 {
    image_base: VA32,
    section_offsets: Vec<RVA32>,
}

let hdr = Header32 { /* ... */ };

在处理32位PE文件时,VA应该是32位的无符号的,RVA应该是32位的有符号的。对于64位PE文件,这两种类型都应为64位。

我希望我的结构为这些类型使用适当的宽度,可能是通过使它们成为泛型:

代码语言:javascript
复制
struct Header<VA, RVA> {
    image_base: VA,
    section_offsets: Vec<RVA>,
}

type VA32 = u32;
type RVA32 = i32;

let hdr: Header<VA32, RVA32> = Header { /* ... */ };

但是VA32只适用于RVA32,而VA64应该只适用于RVA64。有没有一种习惯用法可以表达这一点?

使用完全虚构的语法,我希望这样做:

代码语言:javascript
复制
struct Header<Arch> {
    image_base: arch.VA,
    section_offsets: Vec<arch.RVA>,
}

type Arch32 = { VA: u32, RVA: i32 }

let hdr: Header<Arch32> = Header { /* ... */ };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-22 03:40:40

您可以使用带有关联类型和零大小结构的特征作为标记来执行类似于您编写的语法的操作。

代码语言:javascript
复制
trait Arch {
    type VA;
    type RVA;
}

#[derive(Debug)]
struct Arch32;
impl Arch for Arch32 {
    type VA = u32;
    type RVA = i32;
}

#[derive(Debug)]
struct Arch64;
impl Arch for Arch64 {
    type VA = u64;
    type RVA = i64;
}

#[derive(Debug)]
struct Header<T: Arch> {
    image_base: T::VA,
    section_offsets: Vec<T::RVA>,
}

playground

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55785858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档