Especificación de tipos utilizando una variable

votos
0

Estoy usando un patrón de diseño en el que los números están representados por tipos, como se discutió en una pregunta anterior . Esto funciona bien para mi caso de uso habitual, pero me gustaría ser capaz de implementar un código de prueba que es capaz de generar instancias con el tipo de número (y saber el número correspondiente).

Para un tipo fijo correspondiente a un número fijo, puedo hacer algo como esto:

use std::marker::PhantomData;

trait U32Const {
    const VAL: u32;
}

struct U32Const10;
impl U32Const for U32Const10 {
    const VAL: u32 = 10;
}

trait MyTrait {
    fn do_something(&self, val: u32) -> u32;
}

struct MyType<X: U32Const> {
    marker: PhantomData<X>,
}

impl<X: U32Const> MyType<X> {
    fn new() -> MyType<X> {
        MyType::<X> {
            marker: PhantomData,
        }
    }
}

impl<X: U32Const> MyTrait for MyType<X> {
    fn do_something(&self, val: u32) -> u32 {
        val * X::VAL
    }
}

fn get_instance() -> impl MyTrait {
    MyType::<U32Const10>::new()
}

fn main() {
    let a = get_instance();
    println!({}, a.do_something(4));
}

Ahora lo que quiero ser capaz de hacer es tener la última get_instance()función de tomar una variable y volver distintas instancias.

Así aplicar algo parecido

fn get_instance(val) -> impl MyTrait {
    // ??? returns an instance of MyType::<U32ConstN>::new() where N is set by val
}

Puesto que esto es puramente para fines de pruebas internas, estoy feliz de tener un bajo nivel de disputas y el código inseguro.

Inicialmente pensado para enumerar todos los valores posibles, pero luego tengo el problema de las ramas de los partidos que tienen diferentes tipos, lo que conduce a rasgo objetos, y me preguntaba si hay una solución más ordenado.

Publicado el 09/10/2019 a las 18:53
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more