Pull to refresh

Comments 10

Одна из основных идей nullable — безопасные вложенные вызовы, например на Java:
return Optional.ofNullable(this::getApi)
          .map(CAPI::getDepartment)
          .map(CDepartment::getTitle)
          .orElse("");

И никаких проверок на null в коде в итоге. Может ли так ваше решение?
Судя по всему, автору требовалась монада, а лишь умный указатель.
У вас, по сути, вышел умный указатель с переопределёнными операторами.
boost::optional не использует кучу.
Непонятно, что именно «монструозного» Вы нашли в boost::optional? Исходники его читали разве что — а зачем? А в использовании он крайне прост.
Почему методы виртуальные?

Зачем выделять место под примитивные типы на куче?

Почему конструктор принимает объект по значению, но move-семантика не используется?
NullableType<T>(T value) 
{
    this->value = new T(value);
};


Ну и boost::optional прекрасно конвертируется в указатель: optional::get_ptr(). Кроме того, любая итераторо-подобная вещь конвертируется в указатель конструкцией &*it;

Итого потратили время на медленную негибкую реализацию Nullable, когда в бусте есть эффективная, удобная и отлаженная библиотека optional.
Спасибо, конечно работа с кучей медленнее, но это скажется при большом количестве таких объектов или операций с переприсваиванием.
Методы виртуальные зря, просто по давней привычке чтобы можно было их переопределить в классе наследнике.

В целом пост этот для того, чтобы собрать где-то в одном месте сведения об использовании nullable и дать общее представление об этом вопросе для того, кто с таким не сталкивался, т.к. я в своё время просто не нагуглил бытрого и простого решения.
У вас действительно получился не 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
Спасибо, очень хотелось ссылки на нечто подобное. Думаю в целом, благодаря комментариям, данный пост может оказаться полезен
На всякий случай, скажу, что речи об использовании фич C++11 и выше быть не может

Но nullptr — это же C++11 !?
Прошу прощения, я имел в виду тот факт, что мой проект будет компилироваться только в VS2012, и ограничен только тем, что поддерживается в ней.
В данном случае nullptr просто лучше выглядит нежели (int*)NULL
Sign up to leave a comment.

Articles

Change theme settings