Wie übergebe ich ein Merkmalsobjekt an einen Vektor, der auch im Vektor des Vektors einen einheitlichen Typ hat?

Aug 16 2020

Das ist wirklich schwer zu erklären. Aber was ich will, ist eine Struktur, die ein Feld von Vec "A" hat, das einen Vektor von Threads mit einem anderen Vec "B" innerhalb des Vec "A" enthält. Vec "A" hält sowohl den Vec "B" als auch den Gewindegriff. Vec "B" hat einen einheitlichen Typ, es werden keine Merkmalsobjekte benötigt, aber Vec "A" enthält mehrere verschiedene Arten von Vec "B", die Merkmalsobjekte verwenden. Grundsätzlich möchte ich keine Merkmalsobjekte für Vec "B" verwenden, sondern Merkmalsobjekte für Vec "A".

Ich habe versucht, das oben genannte zu implementieren, aber es fühlt sich nicht immer richtig und fehlerhaft an. Gibt es eine tatsächliche Implementierung oder eine direkte Problemumgehung?

Ich habe versucht, es zu durchsuchen, aber ich habe das Gefühl, dass ich es nicht präzise formulieren kann, ohne einen kurzen Absatz an Google zu schreiben.

Hier ist der (Pseudo-) Code, wie er meiner Meinung nach aussehen sollte:

trait Tag {}

impl Tag for u32 {}
impl Tag for i64 {}


// Vec "B"
type InnerVec<T: Tag> = Vec<T>;

struct ThreadPool {
    // Vec "A"
    threads: Vec<(JoinHandle<()>, InnerVec<dyn Tag>)>,
}

Antworten

1 Locke Aug 16 2020 at 07:57

Zunächst einmal ist ein Typalias kein neuer Typ. Es ist eher ein Such- und ein Ersetzungssystem, um bei langen Typnamen zu helfen (Beispiel :) type Foo<T> = FooSys<T, Vec<T>, u32>;. Ich bezweifle, dass Sie jemals zusätzliche Typeinschränkungen hinzufügen können.

Was Ihr Problem betrifft, würde die direkteste Interpretation Ihres Pseudocodes dem Leben ein Leben lang hinzufügen ThreadPool.

trait Tag {}

impl Tag for u32 {}
impl Tag for i64 {}


struct ThreadPool<'a> {
    threads: Vec<(JoinHandle<()>, Vec<Box<dyn Tag + 'a>>)>,
}

Ich gehe jedoch davon aus, dass Sie wirklich wissen möchten, wie ein Vec dynamischer Vecs mit nicht dynamischen Elementen gespeichert wird. Dazu können Sie es verwenden Anyund in den gewünschten Typ übertragen. Weitere Informationen dazu finden Sie in den Dokumenten .

use std::any::Any;

struct ThreadPool {
    threads: Vec<(JoinHandle<()>, Box<dyn Any>)>,
}

impl ThreadPool {
    pub fn get_tags<T: 'static>(&self, index: usize) -> Option<&Vec<T>> {
        let (_, ref boxed) = self.threads[index];
        boxed.downcast_ref()
    }
}