Rust 要求实现特性的类型被报告(打包)

Rust 要求实现特性的类型被报告(打包),rust,Rust,对于一些OpenGL代码,我创建了一个traitVertex。现在看起来是这样的 trait Vertex: Sized + Clone { //... } 由于我的程序中使用了顶点,因此任何顶点都使用压缩表示法是非常重要的。如果存在任何填充,则可能会产生问题。是否有任何方法可以将顶点特征约束为仅使用压缩表示的类型?如果需要的话,我可以定义我自己的标记特征,我手动为实现Vertex的所有东西实现它。这似乎是编译器可以很容易地呈现和正确执行的东西,但我还没有找到任何类型的表示特征。谢谢这个问题给

对于一些OpenGL代码,我创建了一个trait
Vertex
。现在看起来是这样的

trait Vertex: Sized + Clone {
//...
}

由于我的程序中使用了
顶点
,因此任何顶点都使用压缩表示法是非常重要的。如果存在任何填充,则可能会产生问题。是否有任何方法可以将顶点特征约束为仅使用压缩表示的类型?如果需要的话,我可以定义我自己的标记特征,我手动为实现
Vertex
的所有东西实现它。这似乎是编译器可以很容易地呈现和正确执行的东西,但我还没有找到任何类型的表示特征。谢谢

这个问题给了我动力,促使我完成了一个我一直在做的项目

我只是把它推到了。我一直在用它做一些类似的工作(处理一些奇怪的外国金融机构),但从未发表过

它允许您编写以下代码:

使用repr_trait::Packed;
//安全:只有当T有#[报告(打包)]
包装时不安全(参数:T){
未执行!()
}
fn安全包装(参数:T){
//安全性:因为T保证为#[报告(包装)]
不安全{
包装时的安全(参数)
}
}
#[派生(压缩,默认)]
#[报告(打包)]
结构PackedData(u32,u8);
安全包装(PackedData(123,45));
但这是一个编译错误:

#[导出(压缩)]
结构未打包(u32,u8);
您可以将顶点特征写为:

trait顶点:大小+克隆+压缩{
//...
}

我相信,在当前的情况下,您必须实现标记特征。如果违反合同会导致UB,那么标记特征应该是不安全特征,因此必须在不安全块中实现。如果API需要方便,您可以实现一个派生proc宏,当它可以证明这样做是安全的时,它可以实现不安全特性-例如,当它在类型属性中找到
#[repr(packed)]
时。