Информация об изменениях

Сообщение Они сделали дерьмо опять от 18.05.2020 20:33

Изменено 18.05.2020 20:40 Шахтер

Они сделали дерьмо опять
Комитет по стандартизации пора расстрелять. Такое ощущение, что эти дебилы никогда не писали софт сложнее hello world.


  std::strong_ordering cmp = .... ;

  if( cmp ) // error
    {
    }
  else
    {
     Printf(Con,"equal\n");
    }

  switch( cmp ) // error
    {
     case std::strong_ordering::less : break; // error

     case std::strong_ordering::greater : break; // error

     case std::strong_ordering::equal : break; // error
    }


Кстати, обратите внимание, какие замечательные короткие имена нам предлагают использовать для констант. На пол-экрана. А чо такова, мониторы-то теперь широкие?

Вылечить можно так. Хакаем заголовок <compare>.

  class strong_ordering
  {
    __cmp_cat::type _M_value;

    ....

  public:

    ....

    constexpr operator int() const { return _M_value; }   

    ....

  };


К себе добавляем что-нибудь по вкусу.


inline constexpr int CmpLess = std::strong_ordering::less ;

inline constexpr int CmpGreater = std::strong_ordering::greater ;

inline constexpr int CmpEqual = std::strong_ordering::equal ;


Теперь можно спокойно работать.

  auto cmp = .... ; // вместо std::strong_ordering

  if( cmp ) // ok
    {
    }
  else
    {
     Printf(Con,"equal\n");
    }

  switch( cmp ) // ok
    {
     case CmpLess : break; // ok

     case CmpGreater : break; // ok

     case CmpEqual : break; // ok
    }
Они сделали дерьмо опять
Комитет по стандартизации пора расстрелять. Такое ощущение, что эти дебилы никогда не писали софт сложнее hello world.


  std::strong_ordering cmp = .... ;

  if( cmp ) // error
    {
    }
  else
    {
     Printf(Con,"equal\n");
    }

  switch( cmp ) // error
    {
     case std::strong_ordering::less : break; // error

     case std::strong_ordering::greater : break; // error

     case std::strong_ordering::equal : break; // error
    }


Кстати, обратите внимание, какие замечательные короткие имена нам предлагают использовать для констант. На пол-экрана. А чо такова, мониторы-то теперь широкие?

Вылечить можно так. Хакаем заголовок <compare>.

  class strong_ordering
  {
    __cmp_cat::type _M_value;

    ....

  public:

    ....

    constexpr operator int() const { return _M_value; }   

    ....

    // comparisons

    friend constexpr bool
    operator==(strong_ordering, strong_ordering) noexcept = default;

#if 0

    friend constexpr bool
    operator==(strong_ordering __v, __cmp_cat::__unspec) noexcept
    { return __v._M_value == 0; }

    friend constexpr bool
    operator< (strong_ordering __v, __cmp_cat::__unspec) noexcept
    { return __v._M_value < 0; }

    friend constexpr bool
    operator> (strong_ordering __v, __cmp_cat::__unspec) noexcept
    { return __v._M_value > 0; }

    friend constexpr bool
    operator<=(strong_ordering __v, __cmp_cat::__unspec) noexcept
    { return __v._M_value <= 0; }

    friend constexpr bool
    operator>=(strong_ordering __v, __cmp_cat::__unspec) noexcept
    { return __v._M_value >= 0; }

    friend constexpr bool
    operator< (__cmp_cat::__unspec, strong_ordering __v) noexcept
    { return 0 < __v._M_value; }

    friend constexpr bool
    operator> (__cmp_cat::__unspec, strong_ordering __v) noexcept
    { return 0 > __v._M_value; }

    friend constexpr bool
    operator<=(__cmp_cat::__unspec, strong_ordering __v) noexcept
    { return 0 <= __v._M_value; }

    friend constexpr bool
    operator>=(__cmp_cat::__unspec, strong_ordering __v) noexcept
    { return 0 >= __v._M_value; }

    friend constexpr strong_ordering
    operator<=>(strong_ordering __v, __cmp_cat::__unspec) noexcept
    { return __v; }

    friend constexpr strong_ordering
    operator<=>(__cmp_cat::__unspec, strong_ordering __v) noexcept
    { return strong_ordering(__cmp_cat::_Ord(-__v._M_value)); }

#endif

  };


К себе добавляем что-нибудь по вкусу.


inline constexpr int CmpLess = std::strong_ordering::less ;

inline constexpr int CmpGreater = std::strong_ordering::greater ;

inline constexpr int CmpEqual = std::strong_ordering::equal ;


Теперь можно спокойно работать.

  auto cmp = .... ; // вместо std::strong_ordering

  if( cmp ) // ok
    {
    }
  else
    {
     Printf(Con,"equal\n");
    }

  switch( cmp ) // ok
    {
     case CmpLess : break; // ok

     case CmpGreater : break; // ok

     case CmpEqual : break; // ok
    }