我想在编译时为每种类型生成一个唯一的id。这可能在Rust吗?
到目前为止,我有以下代码
//Pseudo code
struct ClassTypeId{
id: &'static uint
}
impl ClassTypeId{
fn get_type<T>(&mut self) -> &'static uint {
let _id :&'static uint = self.id + 1;
self.id = _id;
_id
}
}
let c = ClassTypeId{id:0};
c.get_type::<i32>(); // returns 1
c.get_type::<f32>(); // returns 2
c.get_type::<i32>(); // returns 1
c.get_type::<uint>(); // returns 3
我从C ++库中偷走了这个想法,看起来像这个
typedef std::size_t TypeId;
template <typename TBase>
class ClassTypeId
{
public:
template <typename T>
static TypeId GetTypeId()
{
static const TypeId id = m_nextTypeId++;
return id;
}
private:
static TypeId m_nextTypeId;
};
template <typename TBase>
TypeId ClassTypeId<TBase>::m_nextTypeId = 0;
}
答案 0 :(得分:8)
std::any::TypeId
做了类似的事情:
use std::any::TypeId;
fn main() {
let type_id = TypeId::of::<isize>();
println!("{:?}", type_id);
}
输出:
TypeId { t: 4150853580804116396 }
答案 1 :(得分:7)
这听起来像是bitflags的工作!宏:
#[macro_use] extern crate rustc_bitflags;
bitflags!(
#[derive(Debug)]
flags ComponentMask: u8 {
const Render = 0b00000001,
const Position = 0b00000010,
const Physics = 0b00000100
}
);
// the set of components owned by an entity:
let owned_components: = Render | Position;
// check whether an entity has a certain component:
if owned_components.contains(Physics) { ... }
http://doc.rust-lang.org/rustc_bitflags/macro.bitflags!.html
答案 2 :(得分:0)
如果您想手动管理类型ID,则会有unique-type-id crate。它允许您指定类型在特殊文件中具有的标识。它将在编译时生成它们。目前它可以这样使用:
^14:00\b[^]]*XXCODE[^]]*error[^]]*]
它既可以使用增量编号生成类型,也可以使用文件中的id。