Обобщающие указатели через `mem :: transmute ()`
Я пытаюсь написать привязки Rust для библиотеки коллекции C (Judy Arrays [1]), которая предоставляет только пространство для хранения значения ширины указателя. В моей компании имеется достаточное количество существующего кода, который использует это пространство для непосредственного хранения не указательных значений, таких как целые числа ширины указателя и небольшие структуры. Я хотел бы, чтобы мои привязки Rust разрешали безопасный для типов доступ к таким коллекциям с использованием обобщений, но у меня возникают проблемы с корректной работой семантики хранения указателей.
mem::transmute()
Функция кажется одним из потенциальных инструментов для реализации желаемого поведения, но попытка использовать его на экземпляре параметризованного типа приводит к ошибке при сборе с толку.
Пример кода:
pub struct Example<T> {
v: usize,
t: PhantomData<T>,
}
impl<T> Example<T> {
pub fn new() -> Example<T> {
Example { v: 0, t: PhantomData }
}
pub fn insert(&mut self, val: T) {
unsafe {
self.v = mem::transmute(val);
}
}
}
Результирующая ошибка:
src/lib.rs:95:22: 95:36 error: cannot transmute to or from a type that contains type parameters in its interior [E0139]
src/lib.rs:95 self.v = mem::transmute(val);
^~~~~~~~~~~~~~
Означает ли это, что тип, состоящий только из параметра, «содержит параметры типа внутри» и, таким образом,transmute()
просто не будет работать здесь? Любые предложения о том, как это сделать?
(Связанный вопроспытаясь достичь того же результата, но не обязательноmem::transmute()
.)
[1] Я знаю о существующихrust-judy
проект, но он не поддерживает сохранение указателей, которое я хочу, и я пишу эти новые привязки в основном как учебное упражнение в любом случае.