[英]Create enum of generic variants of a type
我有一個帶有常量泛型參數VAR
的結構。 該參數用於方法中,提高運行時速度,由於大量比較可以在編譯時完成。 在任何地方存儲和傳遞泛型類型是相當困難的。 我有固定數量的變體,我可以在枚舉SquirrelVariant
中列出,我可以更輕松地傳遞,並使用match
分支到泛型函數。 從Squirrel<VAR>
創建枚舉相當困難,rust 似乎不允許編譯時match
或類似的東西。
struct Squirrel<const VAR: u8>
{
}
enum SquirrelVariant
{
V1(Squirrel<1>),
V2(Squirrel<2>),
V3(Squirrel<3>),
}
// failed attempt 1)
fn make_squirrel_variant<const VAR: u8>(s: Squirrel<VAR>) -> SquirrelVariant
{
match VAR {
1 => SquirrelVariant::V1(s), // expected `1_u8`, found `VAR`
2 => SquirrelVariant::V2(s), // expected `2_u8`, found `VAR`
3 => SquirrelVariant::V3(s), // expected `3_u8`, found `VAR`
}
}
// failed attempt 2)
impl From<Squirrel<1>> for SquirrelVariant
{
fn from(s: Squirrel<1>) -> Self
{
SquirrelVariant::V1(s)
}
}
impl From<Squirrel<2>> for SquirrelVariant
{
fn from(s: Squirrel<2>) -> Self
{
SquirrelVariant::V2(s)
}
}
impl From<Squirrel<3>> for SquirrelVariant
{
fn from(s: Squirrel<3>) -> Self
{
SquirrelVariant::V3(s)
}
}
fn make_squirrel_variant2<const VAR: u8>(s: Squirrel<VAR>) -> SquirrelVariant
{
s.into() // the trait `From<Squirrel<VAR>>` is not implemented for `SquirrelVariant`
// = help: the following implementations were found:
// <SquirrelVariant as From<Squirrel<1_u8>>>
// <SquirrelVariant as From<Squirrel<2_u8>>>
// <SquirrelVariant as From<Squirrel<3_u8>>>
}
您可以使用以下技巧來解決類型錯誤:
struct Squirrel<const VAR: u8> {}
impl<const VAR: u8> Squirrel<VAR> {
fn transmute_squirrel_type<const VAR2: u8>(self) -> Squirrel<VAR2> {
if VAR == VAR2 {
Squirrel { }
} else {
unreachable!()
}
}
}
enum SquirrelVariant
{
V1(Squirrel<1>),
V2(Squirrel<2>),
V3(Squirrel<3>),
}
impl<const VAR: u8> Squirrel<VAR> {
fn to_variant(self) -> SquirrelVariant {
match VAR {
1 => SquirrelVariant::V1(self.transmute_squirrel_type()),
2 => SquirrelVariant::V2(self.transmute_squirrel_type()),
3 => SquirrelVariant::V3(self.transmute_squirrel_type()),
_ => unreachable!()
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.