Ich möchte eine generische Funktion deklarieren, die Merkmalsobjekte akzeptiert und nur Merkmalsobjekte. Ich möchte das, weil ich diese löschen möchte und sie als TraitObject
Objekte über eine ABI-Grenze übergeben.Kann ich eine generische Typbindung haben, die erfordert, dass dieser Typ ein Merkmal ist?
Eine Funktion wie folgt geschrieben wird nicht kompilieren ...
fn f<T: ?Sized>(t: &T) -> std::raw::TraitObject {
unsafe { std::mem::transmute(t) }
}
... mit dem folgenden Fehler:
error[E0512]: transmute called with differently sized types: &T (pointer to T) to std::raw::TraitObject (128 bits)
Ich verstehe, warum der Compiler in verschiedenen Größen klagt: &T
können sei ein Zeiger auf einen konkreten Typ (wie &i32
), der ein einzelner Zeiger (64 Bits) oder ein Merkmalsobjekt (wie &Display
) ist, das zwei Zeiger mit demselben Layout wie std::raw::TraitObject
(128 Bits) sein wird.
Diese Funktion sollte in Ordnung sein, solange &T
ein Merkmalsobjekt ist, d. H. T
ist ein Merkmal. Gibt es eine Möglichkeit, diese Anforderung auszudrücken?
Und um klar zu sein, kann es kein * spezifisches * Merkmalsobjekt sein? Ursache 'fn f (t: & SomeTrait)' wäre immer ein Merkmalsobjekt. – Shepmaster
@Shempmaster Korrekt. Ohne die Generika ist alles schön. –