Я хочу написать черту, которая позволяет мне создавать новые структуры типа реализации, но с другими параметрами типа. Например, скажем, у меня есть какая-то структура
struct Generic<T> {
t: T,
}
, и я хочу черту Constructable
, которая позволяет мне вызывать Generic::new_from_q::<Q>(q as Q)
, т.е. моя черта будет выглядеть так (в псевдо-ржавчине):
trait Constructable {
fn new_from_q<Q>(q: Q) -> Self<Q>; // Self<Q> would be e.g. Generic<Q>
}
impl<T> Constructable for Generic<T> {
type T = T;
fn new_from_q<Q>(q: Q) -> Generic<Q> {
Generic { t: q }
}
}
Конечно, это не имеет смысла, поскольку черта не может гарантировать, что Self
сможет принимать параметр типа Q
. Наиболее близким к реализации желаемого поведения конструктора является следующее:
trait Constructable {
type T;
fn new_from_q<Q>(q: Q) -> impl Constructable<T = Q>; // currently invalid
}
( детская площадка ), что в настоящее время невозможно из-за ограничений синтаксиса impl Trait
(см. # 34511 ), что (я думаю)
- недопустимо в чертах
- не может принимать значения для связанных типов
Итак, как мне обойти эти ограничения? Есть ли какой-то общий шаблон программирования, позволяющий мне это делать (я бы хотел избежать объектов динамической черты)?