ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Пора уже... std::null

Open kelbon opened this issue 3 years ago • 1 comments

Кажется в С++ нарастает количество типов которые... ну как бы "ничего" С++11 std::nullptr_t / nullptr C++17 std::nullopt_t / std::nullopt also C++17 std::monostate (тоже обозначает "ничего" и умеет сравниваться) Важно отметить ещё std::npos std::string::npos и прочее, что на практике является обозначением "ничего" для size_t Теоретически был бы выгоден ещё std::nullany(для std::any), но видимо решили не вводить. Хотят добавить линейную алгебру, там неизбежно появится какой то нуллгеомобъект типа точки (-inf;-inf). Короче кажется постепенно этих штук становится слишком много Так что я предлагаю универсальное решение этих проблем + задел на будущее std::null_t тип и значение std::null Реализация:


  template <typename T, typename... Ts>
  concept one_of = (std::same_as<T, Ts> || ...);

  struct null_t {
    // breakes compilation for every other type(such as void*, if it was operators nullptr_t)
    template <one_of<std::nullptr_t, std::nullopt_t, std::monostate> T>
    consteval operator T() const noexcept {
      return {};
    }
  };

  constexpr inline null_t null = {};

К тому же это может стать заменой void для описания возвращения ничего из функции, например для уменьшения количества магии на квадратный метр, чтобы добавить в шаблонном коде к некому T ссылку/создать значение типа

kelbon avatar Jul 12 '22 13:07 kelbon

https://herbsutter.com/2022/09/25/something-i-implemented-today-is-void/

NN--- avatar Sep 26 '22 01:09 NN---