LINUX.ORG.RU

История изменений

Исправление Siborgium, (текущая версия) :

Как же на языках без такой возможности вообще что-то пишут?!

Да в том-то и дело, что никак не пишут. Я бы с радостью слез с плюсов на какой-то другой язык, но нет ничего. Нигде нет возможности сделать банальный emplace_back. В кресты есть пропозалы на столько хороших и реально полезных вещей, но их не принимают, а тянут, тянут, тянут… Чувствую, придется еще 10 лет ждать.

Ну серьёзно, можешь привести пример, где без этого правда жить нельзя?

Тот самый emplace_back.

Приведённый пример с конструированием произвольных объектов вполне возможно будет сделать.

Ну вот давай разбираться. Пусть у нас есть структурка

struct S<A, B> { ... }

impl<A, B: SomeTrait> S<A, B> {
    pub fn new<C: OtherTrait>(a: A, b: B, c: C) -> Self { ... }
}

и мы теперь хотим вызвать в emplace_back эту функцию, и… у нас ломается модель. Для конструирования структуры необходимо, чтобы переданные args удовлетворяли сигнатуре new, но у нас нет способа описать это в вариадике. Если мы не будем описывать, то у нас ломается одна из базовых идей раста – прописывание всех требуемых трейтов на верхнем уровне.

fn my_push_back<T>(vec: &mut Vec<T> , args...: Args...) {
    vec.push_back(T::new(args...));
}

Вопрос о том, почему в реальности еще и с T::new будут проблемы мы затрагивали ранее, пока просто проигнорируем это.

Исходная версия Siborgium, :

Как же на языках без такой возможности вообще что-то пишут?!

Да в том-то и дело, что никак не пишут. Я бы с радостью слез с плюсов на какой-то другой язык, но нет ничего. Нигде нет возможности сделать банальный emplace_back.

Ну серьёзно, можешь привести пример, где без этого правда жить нельзя?

Тот самый emplace_back.

Приведённый пример с конструированием произвольных объектов вполне возможно будет сделать.

Ну вот давай разбираться. Пусть у нас есть структурка

struct S<A, B> { ... }

impl<A, B: SomeTrait> S<A, B> {
    pub fn new<C: OtherTrait>(a: A, b: B, c: C) -> Self { ... }
}

и мы теперь хотим вызвать в emplace_back эту функцию, и… у нас ломается модель. Для конструирования структуры необходимо, чтобы переданные args удовлетворяли сигнатуре new, но у нас нет способа описать это в вариадике. Если мы не будем описывать, то у нас ломается одна из базовых идей раста – прописывание всех требуемых трейтов на верхнем уровне.

fn my_push_back<T>(vec: &mut Vec<T> , args...: Args...) {
    vec.push_back(T::new(args...));
}

Вопрос о том, почему в реальности еще и с T::new будут проблемы мы затрагивали ранее, пока просто проигнорируем это.