170 похожих чатов

Привет, как я могу заиметь в базовом классе не только

виртуальные методы, но и "виртуальный" тип, таким образом я бы мог его переопределить в производном классе?
Хочется сделать что-то вроде:
class IteratorBase {
public:
using Out; // <<< to be defined
virtual ~IteratorBase() { }
virtual Out next() = 0;
virtual unsigned long sizeHint() const = 0;
};

template<class Container>
class OwnIterator : public IteratorBase {
public:
using IterType = typename std::remove_const<typename Container::const_iterator>::type;
using Out = typename std::iterator_traits<typename Container::const_iterator>::value_type;
private:
Container container;
IterType iter;
public:
OwnIterator(Container c) : container(std::move(c)), iter(container.begin()) {}

Out next() { ... return *iter; }
...
// and so on
...
};

16 ответов

2 просмотра

То есть в производном классе я определяю тип Out на нужный. Как подобные задачи решаются в C++?

Можно параметризовать интерфейс этим типом, правда это будут разные интерфейсы (на каждый Out - свой): template <class Out> class IteratorBase

Danya🔥
CRTP например...

Ну точнее просто передать как шаблонный параметр, да

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Не то.

Тогда никак. Функция возвращает фиксированный тип. Виртуальная не может быть шаблоном. Значит нужно параметризовать класс.

Как вы предполагаете возвращать разные типы из функции, которая выбирается уже в рантайме? IteratorBase* base = /* ... */; auto next = base->next(); ^^^^ должен быть известен компилятору в компилтайме Что должен компилятор подставить на место auto? Угадать намерения программиста? А если программист хочет невозможного?

Ofee Oficsu
Как вы предполагаете возвращать разные типы из фун...

Я могу ограничить все Out-ы ограничить типами с одинаковым или ограниченным размером или, напротив, попросить пожаловаться компилятор, если у него не получается нужный тип вывести

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я могу ограничить все Out-ы ограничить типами с од...

Компилятор почти никогда не может вывести тип. Потому что наследник IteratorBase расположен в dll. Или скрыт в ядре ОС. А быть может, находится в памяти компьютера на тёмной стороне Луны и все запросы к нему выполняются по некоторому RPC Вы, вероятно, имеете ввиду, что у возвращаемого значения есть некоторый интерфейс? Правильно я понимаю, что вам кажется, что вы хотите type erasure на основе этого интерфейса?

Более-менее близкий вариант: объявить внутри базового интерфейсе ещё один struct IValue, возвращать std::unique_ptr<IValue> из next(). В наследниках реализовывать интерфейс. При желании это оптимизируется.

Alexander Karaev
Более-менее близкий вариант: объявить внутри базов...

Согласен, с тем недостатком, однако, что на unsigned long интерфейс не навесишь. Придётся похоже в next возвращать сырой указатель и на стороне клиента кастовать.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Согласен, с тем недостатком, однако, что на unsign...

Не совсем. Можно воспользоваться стиранием типа и в интерфейс завернуть вообще что угодно. Например, в наследнике будет struct Value : IValue { Out value; ... }

Ofee Oficsu
Компилятор почти никогда не может вывести тип. Пот...

Спасибо за детальное разъяснение. Данный приёмчик с типом-мембером довольно широко используется в Скале https://github.com/xmanu/scala-virtual-classes-annotation-macros У меня была гипотеза, что аналог есть и в плюсах

Похожие вопросы

Обсуждают сегодня

Комрады, посоветуйте, куда копать? Стал прикручивать кастомизацию тем. В OnShow главной главной формы пытаюсь загрузить из файла настроек и применить тему (на скрине, как долж...
Ed Doc
13
Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
OnShow один раз вызывается? или возможен Hide?
Iluha Companets
14
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
🥹сениоры нужна помощь. Столкнулся с интересным. Сайт на 1.4 весь в вирусах. Просканировал почистил вроде. Можно конечно скачать развернуть на опенсервере, но пока пробую на ко...
Alexander Grishin 👽
3
Карта сайта