LINUX.ORG.RU

C++, undef значение, подобное perl'овому

 ,


0

2

Для решения одной из задач появилось желание к штатным типам данных добавить еще одно состояние: undefined. Чтобы можно было бы передавать мессадж «Мы еще не определились», или «Используйте значение по умолчанию, нам без разницы какое».

В теории для передачи этого мессаджа можно было бы использовать shared_ptr и ставить его в NULL когда оно не нужно. Но это какой-то оверкил. Память резервировать-освобождать… И главное получается что мысль передается через не предназначенный для этого инструмент, а это плохо для понятности и выразительности кода.

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

★★★

Ответ на: комментарий от zurg

std::optional же ? правда только с 17 стандарта

Годиться…

Спасибо!

shaplov ★★★
() автор топика
Ответ на: комментарий от Siborgium

std::shared_ptr, инициализированный nullptr, ничего не аллоцирует.

А потом когда становиться понятно со значением придется аллоцировать… А если туда-сюда несколько раз дергать знаю-нензнаю… плохо…

shaplov ★★★
() автор топика
Ответ на: комментарий от zurg

Ну boost::optional существует где-то с 2000-х годов.

В принципе это очень простой шаблон. Не понятно, что там можно не смочь.

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Ну boost::optional существует где-то с 2000-х годов.

Ну… boost я не люблю. На ощупь – глюковатое плохозадокументированное изделие.

Не понятно, что там можно не смочь.

Не смог я воспользоваться поисковиком. Про *::optional я не знал, а найти его по описанию функциональности у меня не получилось, куча всего про undefined behavior вылезает и про множества. Но ничего про *::optional.

shaplov ★★★
() автор топика
Ответ на: комментарий от shaplov

Ну… boost я не люблю. На ощупь – глюковатое плохозадокументированное изделие.

Скорее всего, в этот момент, ты смотрел в свой код, а не на boost. :)

BRE ★★
()
Последнее исправление: BRE (всего исправлений: 1)
Ответ на: комментарий от shaplov

Это уточнение к исходному посту. Конечно, optional использовать предпочтительнее.

Siborgium ★★★★★
()
Ответ на: комментарий от BRE

Ну… boost я не люблю. На ощупь – глюковатое плохозадокументированное изделие.

Скорее всего, в этот момент, ты смотрел в свой код, а не на boost. :)

Нет. Поскольку этот код я докатывал с состояния 2010 до 2022 постепенно повышая версии дистрибутива и решая проблемы, я собрал комбо из багов и регрессий которые были в boost’е за эти 10 лет. Так вот, например эти проблемы нигде не задокументированы. Об их существовании и решении проблем я узнавал из сторонних багтрекеров в которых с похожими проблемами тоже боролись… Во-вторых не было выпущено корректирующего релиза эти баги исправляющего. Не нашлось так же места в котором бы анонсировалось что в следующем мажорном релизе проблема устранена. В результате у меня в коде болтаются #ifdefы актуальность которых мне не неизвестна. Думаю что вычистятся они из кода вместе с самим бустом.

shaplov ★★★
() автор топика
Ответ на: комментарий от BRE

Ну… boost я не люблю. На ощупь – глюковатое плохозадокументированное изделие.

Скорее всего, в этот момент, ты смотрел в свой код, а не на boost. :)

А еще я был вынужден использовать boost::python на который вообще нет никакой документации… При переходе с 2.7 на 3 питон оно крешиться, почему – неведомо… Документации – нету.

shaplov ★★★
() автор топика
Последнее исправление: shaplov (всего исправлений: 1)
Ответ на: комментарий от dataman

На всякий случай: https://github.com/tylerreisinger/result https://github.com/p-ranav/result

Красиво!

Спасибо!

Сейчас мне не пригодиться. У меня случай «мы не определились» или «вот этого не надо», а не случай, «ой все сломалось». Но для своих целей выглядит как очень правильная штука…

shaplov ★★★
() автор топика
Ответ на: комментарий от zx_gamer

В принципе это очень простой шаблон. Не понятно, что там можно не смочь.

Я бы посмотрел как ты его на собесе «смог» с первого раза. Со всеми move/copy к-торам и присваиваниями (не забыть self assignment), учитывая что оборачиваемый тип может быть не copyable и/или не movable, с inplace конструкцией, монадическими операциями и итераторами.

anonymous
()
Ответ на: комментарий от anonymous

Я бы посмотрел как ты его на собесе «смог» с первого раза.

Не думаю что получится. Не думаю что @zx_gamer пойдет к тебе работать. Я бы не пошел бы.

shaplov ★★★
() автор топика
Ответ на: комментарий от shaplov

братишка, ничего личного, но если ты в 2к24 не знал про std::optional, то твои знания крестов под большим сомнением. я бы даже сказал что их и нет, как бы тебе твоё самомнение не говорило обратное

peacelove
()
Ответ на: комментарий от peacelove

Ну это преувеличение: STL можно не знать вообще и отлично программировать на C++ со всеми «выкрутасами».

zx_gamer ★★★
()
Ответ на: комментарий от shaplov

Это все что ты смог найти в интернете? Свои #ifdef’ы ты решил не показывать или их нет?

Даааа, после этого пользоваться boost категорически нельзя. :)

BRE ★★
()
Последнее исправление: BRE (всего исправлений: 1)
Ответ на: комментарий от shaplov

Да он и не начинался. ))

Не обижайся, но всегда смешно смотрится, когда новичек начинает делать выводы про серьезные вещи, на основании своего небольшого опыта.

BRE ★★
()
Ответ на: комментарий от BRE

Не обижайся, но всегда смешно…

Вы попробуйте с людьми по-умолчанию уважительно общаться. Возможно количество упущенных возможностей в жизни резко пошло бы на убыль…

shaplov ★★★
() автор топика
Последнее исправление: shaplov (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.