Как сделать дженерик из дженерика с чертой? - PullRequest
2 голосов
/ 04 апреля 2019
pub struct Triangle<T: Float + std::clone::Clone, V: vector::Vector<T>> {
    point1: V,
    point2: V,
    point3: V,
}

Этот кусок кода не компилируется, потому что T не используется (тем не менее, T используется позже в методе)

Я пробовал этот синтаксис

pub struct Triangle<V: vector::Vector<T: Float + std::clone::Clone>> {
    point1: V,
    point2: V,
    point3: V,
}

Ошибка:

expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `:`

expected one of 7 possible tokens here

и этот синтаксис

pub struct Triangle2<V> where V: vector::Vector<T> where T: Float {
    point1: V,
    point2: V,
    point3: V,
}

Ошибка:

expected `where`, or `{` after struct name, found keyword `where`

expected `where`, or `{` after struct name

, которая не работает.

Является ли ихспособ решить эту проблему

1 Ответ

4 голосов
/ 04 апреля 2019

Я предполагаю, что ваш тип Vector выглядит примерно так.

pub trait Vector<T> {
    // Some functions
}

Решение состоит в том, чтобы объявить несколько универсальных типов и перечислить их ограничения типов по отдельности: Тип V долженреализовать Vector<T> и набрать T в свою очередь должны реализовать Float и Clone.

pub struct Triangle<V, T>
where
    V: vector::Vector<T>,
    T: Float + Clone,
{
    point1: V,
    point2: V,
    point3: V,
    phantom: PhantomData<T>,
}

Я использую std :: marker :: PhantomData для сохраненияиначе неиспользуемая информация о типе.

Ссылка на полный рабочий код .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...