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