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

Часто ли вы используете полиморфизм в виде классов? Я просто пришел

в выводу, что лучше использовать ссылку на функцию (как вариант - function_ref, или https://github.com/zhihaoy/nontype_functional )
Вот смотрите, есть класс кухня и внутри кухня держит экземпляр абстрактного кипятильника.
Ты можешь в любой момент подсунуть туда любой механизм, что умеет кипятить
(при условии что он унаследован он абстрактного кипятильника).
Также ты можешь держать std:: variant чайников и подсовывать любой чайник (бойлер, электро, или самовар ).
(и тогда нужен визитор).

Третий вариант это type_erasure - данный подход хорошо описан тут - https://www.foonathan.net/2020/01/type-erasure/

А вот смотрите как можно гораздо проще с функциями, вместо классов-рабочих.

Ты держишь просто в качестве члена данных указатель на функцию , функция принимает сырую воду и отдает кипяток.

В этот указатель на функцию просто кладешь любую функцию, что принимает воду и отдает кипяток.
Ты можешь сделать шаблонную функцию, создать её с параметром типа Самовар.
И ты передашь в нее сырую воду.
Что происходит внутри этой функции, твой класс, как пользователя кипятильника, не интересует.
Внутри же просто создаётся самовар , мы пользуемся им и потом наружу отдается кипяток из функции.
Тебе не надо все время держать на кухне кучу самоваров и чайников. Ты просто держишь книгу рецептов.
Если тебе надо что то получить, ты тупо исполняешь рецепт (а в рецепте уже написано возьми самовар, ,налей в него воду и т. д.)
И не надо также городить никакие виртуальные функции и визиторы.

Я пришел к выводу, что объекты они конечно нужны сами по себе,
но они лишь служат временно для достижения цели.
Тебе не надо допустим, в твоём классе огород все время держать кучу тракторов и культиваторов.
Они будут тупо занимать пространство (память). Ты трактором пользуешься раз в год.
Проще держать указатель на функцию,
а в него уже класть функцию "пашня вспаши<трактором>(земля)" или пашня вспаши<негром_с_лопатой>(земля)

4 ответов

7 просмотров

Если функция одна - ок. Если функции две или есть ещё данные рядом, уже менее удобно стирать тип, поэтому используют классы

А чем плох вариант держать умный указатель на интерфейсный класс?

The Pressbraker- Автор вопроса
Андрей Таусинов
А чем плох вариант держать умный указатель на инте...

Так тоже можно, да. Подсовываешь в указатель на базовый класс фактический класс-трудягу.

А статический полиморфизм делает инлайнинг и избавляет от накладных расходов в виде vtable и косвенных вызовов функций по их указателю.

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
TCodePointer = record cp: CodePointer; name: string; cnt: Integer; next: TCodePointerArray; // этот тип ещё неизвестен end; TCodePointerArray = array of ...
notme
9
Привет ) есть такой кусок кода, он считывает ini файл. my $conf = Config::IniFiles->new( -file => $ini_file ); if (!$conf) { $self->my_die('cannot_read_cfg', ...
Kolya lastname
7
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Блин, интересно, кто-нибудь когда-нибудь переписывал какую-нибудь игру с x86 на arm? Вообще, такое возможно?
Alan 🔝 Бэброу
13
why html and css is not standard? i mean why different browser has their own engine and styles and how them work to show result to end user?
Mr Thieves
10
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Карта сайта