Comments 10
Одна из основных идей nullable — безопасные вложенные вызовы, например на Java:
И никаких проверок на null в коде в итоге. Может ли так ваше решение?
return Optional.ofNullable(this::getApi)
.map(CAPI::getDepartment)
.map(CDepartment::getTitle)
.orElse("");
И никаких проверок на null в коде в итоге. Может ли так ваше решение?
+1
У вас, по сути, вышел умный указатель с переопределёнными операторами.
boost::optional не использует кучу.
boost::optional не использует кучу.
+1
Непонятно, что именно «монструозного» Вы нашли в boost::optional? Исходники его читали разве что — а зачем? А в использовании он крайне прост.
+1
Почему методы виртуальные?
Зачем выделять место под примитивные типы на куче?
Почему конструктор принимает объект по значению, но move-семантика не используется?
Ну и
Итого потратили время на медленную негибкую реализацию Nullable, когда в бусте есть эффективная, удобная и отлаженная библиотека optional.
Зачем выделять место под примитивные типы на куче?
Почему конструктор принимает объект по значению, но move-семантика не используется?
NullableType<T>(T value)
{
this->value = new T(value);
};
Ну и
boost::optional
прекрасно конвертируется в указатель: optional::get_ptr()
. Кроме того, любая итераторо-подобная вещь конвертируется в указатель конструкцией &*it
;Итого потратили время на медленную негибкую реализацию Nullable, когда в бусте есть эффективная, удобная и отлаженная библиотека optional.
+2
Спасибо, конечно работа с кучей медленнее, но это скажется при большом количестве таких объектов или операций с переприсваиванием.
Методы виртуальные зря, просто по давней привычке чтобы можно было их переопределить в классе наследнике.
В целом пост этот для того, чтобы собрать где-то в одном месте сведения об использовании nullable и дать общее представление об этом вопросе для того, кто с таким не сталкивался, т.к. я в своё время просто не нагуглил бытрого и простого решения.
Методы виртуальные зря, просто по давней привычке чтобы можно было их переопределить в классе наследнике.
В целом пост этот для того, чтобы собрать где-то в одном месте сведения об использовании nullable и дать общее представление об этом вопросе для того, кто с таким не сталкивался, т.к. я в своё время просто не нагуглил бытрого и простого решения.
-1
У вас действительно получился не optional, а очень обрезанный умный указатель.
На самом деле optional давно есть из коробки в современных c++ библиотеках (libstdc++ и libc++): en.cppreference.com/w/cpp/experimental/optional, но если на них завязываться не хочется, а монструозность boost пугает, вместо того чтобы опускаться до написания велосипеда достаточно взять один заголовочный файл из любой из трёх упомянутых библиотек. Я взял из libc++, потому что у неё самый чистый и понятный код, получилось так:
github.com/AMDmi3/libSDL2pp/blob/master/SDL2pp/external/libcpp_optional.hh
На самом деле optional давно есть из коробки в современных c++ библиотеках (libstdc++ и libc++): en.cppreference.com/w/cpp/experimental/optional, но если на них завязываться не хочется, а монструозность boost пугает, вместо того чтобы опускаться до написания велосипеда достаточно взять один заголовочный файл из любой из трёх упомянутых библиотек. Я взял из libc++, потому что у неё самый чистый и понятный код, получилось так:
github.com/AMDmi3/libSDL2pp/blob/master/SDL2pp/external/libcpp_optional.hh
+1
На всякий случай, скажу, что речи об использовании фич C++11 и выше быть не может
Но nullptr — это же C++11 !?
+1
Sign up to leave a comment.
Articles
Change theme settings
Простая замена Boost::Optional для использования nullable-типов в проектах C++