【发布时间】:2018-05-29 12:55:20
【问题描述】:
我正在尝试通过遵循TheChernoProject Series on openGL 来实现VertexBufferLayout 结构。我已经很容易地将 C++ 系列改编为 Rust,但我被卡住了。
VertexBufferElement 有一个计数,它使用的data_type 的 glEnum 和一个标准化的布尔值。有一个名为push 的通用方法,它采用 u32 计数,将 VertexBufferElement 推送到元素 Vec 并更新步幅。
我似乎无法让函数接受匹配类型的代码。当我遇到错误时,我尝试使用TypeId、Any 和PhantomData。
pub fn push<T: 'a>(&mut self, count: u32) {
let dt = TypeId::of::<T>();
let (data_type, normalized) = if dt == TypeId::of::<i8>() {
(gl::BYTE, false)
} else if dt == TypeId::of::<u8>() {
(gl::UNSIGNED_BYTE, true)
} else if dt == TypeId::of::<i16>() {
(gl::SHORT, false)
} else if dt == TypeId::of::<u16>() {
(gl::UNSIGNED_SHORT, false)
} else if dt == TypeId::of::<i32>() {
(gl::INT, false)
} else if dt == TypeId::of::<u32>() {
(gl::UNSIGNED_INT, false)
} else if dt == TypeId::of::<f16>() {
(gl::HALF_FLOAT, false)
} else if dt == TypeId::of::<f32>() {
(gl::FLOAT, false)
} else if dt == TypeId::of::<f64>() {
(gl::DOUBLE, false)
} else {
panic!("Incompatible Type")
};
self.elements.push(VertexBufferElement{data_type, count, normalized, _marker: PhantomData});
self.stride += mem::size_of::<T>();
}
error[E0310]: the parameter type `T` may not live long enough
--> opengl\examples\vertex_buffer_layout.rs:26:18
|
25 | pub fn push<T: 'a>(&mut self, count: u32) {
| -- help: consider adding an explicit lifetime bound `T: 'static`...
26 | let dt = TypeId::of::<T>();
| ^^^^^^^^^^^^^^^
|
note: ...so that the type `T` will meet its required lifetime bounds
--> opengl\examples\vertex_buffer_layout.rs:26:18
|
26 | let dt = TypeId::of::<T>();
|
起初它的'T'可能活得不够长,但它只是一个通用函数,并且浮点数只指示保存的数字,而不是类型本身,所以我尝试了PhantomData。之后的任何错误都是我不知道自己在做什么,之前从未使用过PhantomData,并且找不到任何适合这种情况的东西。
【问题讨论】:
标签: rust