【发布时间】:2015-03-18 05:10:40
【问题描述】:
我有几个枚举。它们每个都有数字标签,可以转换为整数 (isize)。我有一个他们都定义的特质。但是该特征的实例不再可以转换为整数,因为编译器无法证明所有实现实际上都是无参数枚举。
是否有任何特征意味着类型是无参数枚举或可转换为整数(通过任何方式),我可以在需要获取数值的泛型中用作约束?
更具体地说,这是一个代码示例 (also on play):
enum Foo {
a = 1,
b = 2,
c = 3,
}
enum Bar {
d = 4,
e = 5,
f = 6,
}
trait Process : std::marker::MarkerTrait {
fn process(v: isize) -> String;
}
impl Process for Foo {
fn process(v: isize) -> String { format!("foo{}", v) }
}
impl Process for Bar {
fn process(v: isize) -> String { format!("bar{}", v) }
}
// just for sake of argument; something more complex in reality, of course
fn extern_call(v: isize) -> isize { 2 * v + 211 }
fn process<T: Process>(v: T) -> String {
T::process(extern_call(v as isize))
}
fn main() {
println!("a: {}", process(Foo::a));
}
显然问题出在process,v as isize 编译失败
错误:非标量转换:
Tasisize
所以我想做类似的事情
process<T: Process + scalar>
或
process<T: Process + ToPrimitive>
或者告诉编译器只允许转换为 isize 的类型,但我不知道那可能是什么。
【问题讨论】:
标签: rust