Бабушка, смотри, я сделал двач! Войти !bnw Сегодня Клубы

Почему Base and Derived ковариантны, однако, shared_ptr<Base> and shared_ptr<Derived> - нет?

Рекомендовали: @o01eg
#0F2EHU / @ninesigns / 3431 день назад

ответил в раковне чтобы унизить сноба дедфуда

#0F2EHU/W8M / @hirthwork / 3431 день назад
1) Инстациации с разными типами шаблона класса могут быть совершенно разными по интерфейсу и модели памяти (std::vector<bool> vs std::vector<T> как пример). 2) Ковариантность и контрвариантность потребует либо встроенного type erasure (как дженерики в джаве), либо иммутабельности контейнеров, т.к. иное может ломать систему типов при попытке всунуть в контейнер, инстациированный для одного наследника, объекты другого наследника.
#0F2EHU/CU1 / @dzhon / 3431 день назад

@dzhon 1. каким местом тут модель роляет, если считать Base и Derived ковариантными?
2. иммутабельные контейнеры никто не додумался еще сделать чтоль?

#0F2EHU/17M / @ninesigns --> #0F2EHU/CU1 / 3431 день назад
@4da 2. Нужна иммутабельность, прикреплённая к типу, first-class, если удобно. 1. Таким, что специализация шаблона может быть абсолютно произвольной. Предположим, что есть cont<Base> cnt = cont<Derived>, а cont<Derived> специализирован так, что не имеет полей-стораджей вообще, а вычисляет данные по запросу (тупой вариант, но понятный последствиями), так вот положив в cnt ещё какой-нибудь Derived2, у тебя уже получается коллапс системы типов.
#0F2EHU/DVJ / @dzhon --> #0F2EHU/17M / 3431 день назад

@dzhon я чот не догоняю: если Base имеет поля-стораджи, то при открытом наследовании они у Derived тоже будут.

#0F2EHU/CIO / @ninesigns --> #0F2EHU/DVJ / 3431 день назад

@dzhon * открытые поля-стораджи.
если они закрытые, то о чем разговор вообще?

#0F2EHU/REX / @ninesigns --> #0F2EHU/DVJ / 3431 день назад
@4da Речь о сторадже самого контейнера, а не типов, агрегируемых в нём.
#0F2EHU/P9X / @dzhon --> #0F2EHU/CIO / 3431 день назад

@dzhon у тебя контейнер скоупом чтоли параметризируется? как в одном контейнере могут быть разные поля?

#0F2EHU/7L1 / @ninesigns --> #0F2EHU/P9X / 3431 день назад
@dzhon template<typename T> struct cont { T arr[10]; T operator[] (int ind) { return add[i]; } }; template<> struct cont<Derived1> { Derived1 operator[] (int ind) { return DerivedCalculator(ind); } };
#0F2EHU/JFP / @dzhon --> #0F2EHU/P9X / 3431 день назад
@4da ответил плюсовой блевотиной
#0F2EHU/IEW / @dzhon --> #0F2EHU/7L1 / 3431 день назад
@dzhon Короче, если коротко и простыми словами общо, то C++ и язык шаблонов C++ -- две разные самостоятельные сущности и оба с Тьюринг-полнотой. Ковариантность относится к первому языку, а параметризованные типы-контейнеры ко второму; при этом у этих языков полностью отличается система типов (второй чисто функциональный, а первый мультипарадигменный).
#0F2EHU/TTC / @dzhon --> #0F2EHU/JFP / 3431 день назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.