1. C++ / Говнокод #20466

    +7

    1. 1
    value = *((const char*)(*it).second.value);

    void* -> const char* -> char

    Запостил: ptr2ptr, 04 Августа 2016

    Комментарии (21) RSS

    • Где здесь C++, ptr2ptr?
      Ответить
      • Скорее всего it это итератор на что-то вроде std::map<whatever_t, void*>

        Возможно можно было вместо (*it). написать it-> Иначе хз в чем именно гк
        Ответить
        • > в чем именно гк
          В потенциальном UB'е, например. Вдруг в it->second.value был нулл или слишком короткий буфер. Я бы въебал как минимум ассёрт.
          Ответить
          • > Я бы въебал как минимум ассёрт

            Я бы просто въебал. Нехуй void* использовать. По крайней мере можно было выделить эту хуйню в функцию.
            Ответить
            • > выделить эту хуйню в функцию
              Ну, по-хорошему, это должно быть в акцессоре у того, у чего брали value (а само value - в привате)...
              Ответить
              • Я надеюсь что это дроч приватных полей внутри члена класса. Иначе вопрос — где здесь С++?
                Ответить
            • З.Ы. Кресты - говно. В джаве/шарпе нельзя выябываться и оптимизировать - код получается унылым, медленным, жрущим память, но пишется быстро и с первого раза...

              А на крестах я сегодня ведь день проебал чтобы скрестить ужа с ежом - чтобы и память лишний раз не аллоцировало, и исключения не кидало (но ошибки не теряло), и кишки сишной реализации наружу не торчали, и типобезопасно было, и все типичные юзкейсы няшно и кратко смотрелись...

              В итоге закончилось всё void* в единственном приватном поле у всех публичных классов этого модуля ;(
              Ответить
              • А чем any не подошёл? Типобезопасности побольше, исключения опциональны.

                > Кресты - говно
                Удивил. Всё говно, кроме говна — оно ценное удобрение. Но не всё. Некоторое говно — говно.
                Ответить
                • > чем any не подошёл
                  чтобы и память лишний раз не аллоцировало

                  Там void* не потому что много разных вариантов, а потому что структуру в хедере палить нельзя (она сишная, т.е. попадёт в корневой неймспейс). А саму структуру в any сунуть тоже нельзя, т.к. класс не должен контролировать её время жизни (чё-то типа итератора)...
                  Ответить
                  • Этакий доморощённый type-erasure? У меня где-то валялся any_pointer. type_info + void* + касты с проверкой типа положенного значения. Хотя если void* только для скрытия типа, то и это не нужно, да.

                    А не хочется палить даже имя структуры? Потому что для объявления указателя достаточно объявления struct kokoko;
                    Ответить
                    • Да просто имя сишное, без неймспейсов. Хуй знает до какого угла проекта оно доползёт из этого хедера...
                      Ответить
    • -> для слабаков
      Ответить
      • А вдруг -> перегружен? Ну а вдруг?
        Ответить
        • > А вдруг -> перегружен? Ну а вдруг?
          А вдруг * перегружена? Ну а вдруг?

          З.Ы. Их как бы парочкой обычно и перегружают.
          Ответить
          • да и название it намекает, что не вдруг, а перегружены
            Ответить
            • А вдруг там тупо указатель в качестве итератора?
              Ответить
              • Возможно в этом и состоит говнокод?
                Ответить
          • А в ppCьке нет принудительной парной перегрузки?
            Ответить
            • Нет конечно, зачем отбирать возможность разложить грабли?
              Ответить
              • Иногда мне кажется, что ppCьку специально делали максимальным говном
                Ответить

    Добавить комментарий