cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open kelbon opened 1 year ago

kelbon commented 1 year ago

Кажется в С++ нарастает количество типов которые... ну как бы "ничего" С++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 ссылку/создать значение типа

NN--- commented 1 year ago

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