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

    +4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    int main()
    {
        using Human = NamedTuple<
            Field<"name", std::string>,
            Field<"age", int>
        >;
        using User = NamedTuple<
            Field<"login", std::string>,
            Field<"password", std::string>
        >;
    
        Human vasya{ "Vasya", 16 };
        vasya.get<"age">() = 17;
    
        User user{ "xXxBaCRHxXx", "p4ssword" };
    
        auto vasyaMerged = mergeNamedTuples(vasya, user);
    
        std::cout << vasyaMerged.get<"name">() << " is " << vasyaMerged.get<"age">() << " years old!" << std::endl;
        std::cout << "Login is " << vasyaMerged.get<"login">() << " and password is " << vasyaMerged.get<"password">() << std::endl;
    }

    Как похорошел C++ при C++20!

    https://wandbox.org/permlink/llpXuy7IOSugtxHo

    Запостил: PolinaAksenova, 18 Апреля 2021

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

    • Някаких std::map, всё статически:
      template<StringLiteral Name, typename T>
      struct Field {
          constexpr static auto name = Name;
          using type = T;
      };
      
      template<StringLiteral... Names, typename... Types>
      auto fieldsToTuple(const Field<Names, Types> &...)
      {
          return std::tuple<Types...>{};
      }
      
      template<StringLiteral Name, size_t CurIdx, typename FieldsHead, typename... FieldsRest>
      constexpr size_t getFieldIdx()
      {
          if constexpr (Name == FieldsHead::name) {
              return CurIdx;
          } else {
              return getFieldIdx<Name, CurIdx + 1, FieldsRest...>();
          }
      }
      
      template<typename... Fields>
      struct NamedTuple {
          using StorageType = decltype(fieldsToTuple(std::declval<Fields>()...));
          StorageType storage;
      
          template<typename... Args>
          constexpr NamedTuple(Args &&... args) : 
              storage(std::forward<Args>(args)...)
          {
          }
      
          template<StringLiteral FieldName>
          auto & get()
          {
              return std::get<getFieldIdx<FieldName, 0, Fields...>()>(storage);
          }
      
          template<StringLiteral FieldName>
          auto & get() const
          {
              return std::get<getFieldIdx<FieldName, 0, Fields...>()>(storage);
          }
      
          template<size_t Idx>
          auto & getByIndex()
          {
              return std::get<Idx>(storage);
          }
      
          template<size_t Idx>
          auto & getByIndex() const
          {
              return std::get<Idx>(storage);
          }
      };
      Ответить
      • ой как наметушил
        Ответить
        • Метушки разметушились
          Но конпилить не решились
          Если много метушиться
          Можно разума лишиться
          Если разума лишиться
          Нечем будет метушиться
          Ответить
    • И ведь на этой штуке даже компайлтайм рефлексия будет работать. Можно поля перечислить, методы для сериализации нагенерить и т.п.
      Ответить
    • Давно говорю, что нужно стирать грань между компайл-тайм и рантайм

      Кстати гост, это ведь по сути и есть кокогенерация
      Ответить
      • Но она не в рантайме. Тут есть чёткая грань когда генерация закончилась. И нельзя всякую хрень с сайд-эффектами звать до этой точки.

        А в питоне всё в кашу, зато ближе к гомоиконщине.
        Ответить
        • Кодогенерация в рантайме это вообще был бы лулз, ведь это же самомудифицирующйся код

          >Тут есть чёткая грань
          пока есть:)

          Но вот уже целые функции (getFieldIdx) у нас в компайл тайме работают
          Ответить
          • А в питоне то всякие ормы именно в рантайме генерят классы. Там этой грани нету.
            Ответить
            • Ну вообще в "правильном" ООП а-ля смоллток вызов метода это просто посылка сообщения, так что нет ничего дурного в том, чтобы делать свитч по имени "метода". Нет никаких методов, есть "посылка сообщения", в котором имя метода это просто параметр.

              Правда в питоне в рантайме можно генерить и классы тоже.

              Просто это очень не быстро в сравнении с крестами)
              Ответить
              • > нет ничего дурного

                Вообще говоря есть. Это же ставит крест на статическом анализе. Ужк ничего нельзя узнать о коде до его исполнения.

                Ну собственно в смоллтолке никакой статической типизации и не было, емнип.
                Ответить
                • Смоллток это же дедушка всей динамики, а где есть динамика -- там нет статического анализа.

                  А еще это очень отсосно с точки зрения перформанса.

                  Но зато это позволяет делать очень крутые штуки, например умную делегацию.
                  Ты можешь получить объект "вызов метода" с его аргументами, подождать немного, и передать другому объекту.

                  Могу ошибаться, но вроде бы точно так же работает ObjC.
                  Ответить
                  • дедушка всей динамики это LISP
                    Ответить
                    • Дедушка всей мейнстримной динамики я имел ввиду.

                      LISP это как раз та самая гомоиконность, где нету разницы между кодом и данными, а потому можно считать, что нету разницы между "компайл" и "ран" таймом
                      Ответить
                      • В смоллтолке этой разницы тоже нет... Настолько нет, что edit-and-continue там и зародился.
                        Ответить
                        • А REPLы скриптушни тоже отсюда?)

                          Кстати, питон еще более ли менее "статический": там всё таки не принято править классы в рантайме без надобности (кроме фреймворков), а например в Ruby очень даже принято.
                          А в JS и вовсе "классы" это просто сахар для создания объектов с полем "prototype".

                          Скриптушня должна быть динамической, иначе нахуй она вообще нужна?
                          Ответить
                          • Реплы из лиспа.
                            Ответить
                            • А реплаи — из Твиттера ヽ(*⌒▽⌒*)ノ!
                              Ответить
                              • Не из почты (бумажной)?
                                Ответить
                                • SMM-словарь "Progressium" считает, что нят!
                                  Ответить
                                  • А Леонардо и Микеланджело это черепашки ниндзя
                                    Ответить
                                    • А ООП придумали в Java.
                                      Ответить
                                      • А хорошую архитектуру придумали в ООП
                                        Ответить
                                        • А функциональный язык программирования — это когда есть функции.
                                          Ответить
                                          • Или так: функциональный язык это тоже джава, когда туда завезли лямбды

                                            У нас был когда-то очень давно тред типа
                                            * структурное программирование это когда есть структуры
                                            * процедурное когда процедуры
                                            * функциональное когда функции
                                            итд
                                            Ответить
                                            • Логическое -- когда есть bool.
                                              Декларативное -- когда есть декларации (т.е. сишка подходит).
                                              Ответить
                                              • Внезапно d.ts и pyi подводят под это определение TS и Python

                                                >Логическое -- когда есть bool.
                                                (т.е. классическая сишка не подходит).
                                                Ответить
                                                • Ну если применить метаклассы в петоне, то будет декларативность. Я так декларативный бинарный парсер/райтер писал.
                                                  Ответить
                                                  • не изобрети случайно DSL, иначе тебя релоцируют в руби или груви
                                                    Ответить
                                                    • Не релоцируют, я работаю на себя. Изначально была цель написать свой вариант парсера/райтера в стиле либы Construct, которая неимоверно уебищна синтаксически.
                                                      Ответить
                                                • классическая сишка - это что?
                                                  Ответить
                                                  • ну до c99 вроде, когда там bool завезли?
                                                    Ответить
                                                  • Патрульный корабль Береговой охраны ВМС Китая потопил вьетнамскую рыболовецкую шхуну у спорных Парасельских островов (островов Сиша), сообщает 3 апреля агентство DPA со ссылкой на источники в правительстве Вьетнама.
                                                    Ответить
                                                    • а есть острова тсиша, киша, пдкиша, аша, баша и бизибокса?
                                                      Ответить
                                                      • А у бизибокса какой шелл кста за основу взят?
                                                        Ответить
                                                        • брат за брата
                                                          Ответить
                                                        • ash вроде
                                                          Ответить
                                                          • sh -> ash -> bash?

                                                            З.Ы. А, нет... sh -> ash -> dash
                                                            Ответить
                                                            • bash это ksh плюс кое-что из csh кмк изначально
                                                              Ответить
                                                            • keyspace всего 26², можно побуртить
                                                              Ответить
                                                            • оффтоп: Борманд, а в ACPI нету метода для батарейки чтобы отключить зарядку?

                                                              я вот тут рыл (https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf) и там походу только калибровка и состояние заряда есть.

                                                              То есть универсального способа отключить зарядку нет, только всякие вендор-специфик штуки?
                                                              Ответить
                                                              • Х.з., если ты в спеке не нашёл -- наверное нету.

                                                                Декомпильни свои таблицы и посмотри какие там методы есть. Хотя по четырём буквам там хуй поймёшь что они делают...
                                                                Ответить
                                                                • Можно подёргать все методы, и узнать:)

                                                                  Я, собсно, чего туда полез.

                                                                  До меня доебался знакомый, и спрашивает меня как тыжпрограммиста как удлиннить жизнь батареи не доводя её до заряда 100%.
                                                                  Понятно, что контроллер не позволит этого сделать, но он хочет сам этим управлять.

                                                                  Некотоыре вендоры делают софт, но универсального способа нет.

                                                                  Я вот и решил понять, действительно ли его нет.

                                                                  Похоже, что Smart Battery в ACPI довольно read-only питушня
                                                                  Ответить
                                                                  • Дык контроллер заряда сам держит нужный запас, не? Иначе она бы перегрелась, ёбнула и сожгла всё нахуй (привет, самсунг).

                                                                    Или он хочет ещё ниже?
                                                                    Ответить
                                                                    • он еще хочет.

                                                                      Контроллер конечно не даст ей разрядиться и зарядиться полностью, иначе она сломается.

                                                                      Контроллер держит её в промежутке 20%-80% наверное, и врёт (через ACPI) что она 100%.

                                                                      Но он хочет еще, пушо начитался говна в Интернете.

                                                                      Некоторые вендоры же дают такую возможность
                                                                      Ответить
                                                                      • > начитался говна в Интернете

                                                                        По-моему это история в духе "я переместил кеш браузера на HDD и теперь мой SSD проживёт дольше!"

                                                                        Будет заряжать батарею чаще (ёмкость то упала), в итоге то на то и выйдет, имхо. Зато ёбли себе добавит.
                                                                        Ответить
                                                                        • да, я ему примерно так и сказал, и посоветовал еще кактус около монитора от радиации

                                                                          Но его заклинило)
                                                                          Ответить
                                                                          • Пусть вытащит и положит на полку если рядом есть розетка. Так сохраннее будет.
                                                                            Ответить
                                                                            • Там нужно крышку открутить, чтобы батарею достать, а комп пока на гарантии


                                                                              Он поставил batterylimiter, он пищит при зарядке 80%, и предлагает руками вынуть штепсель))
                                                                              Ответить
                                                                              • > и предлагает руками вынуть штепсель

                                                                                Ага, чтобы батарея пошла на разряд... Заебись оптимизация жизни батарейки.
                                                                                Ответить
                                                                                • не, ну можно конечно и батаерею отключить физически, но у него это трудно сделать

                                                                                  В общем мне было важно понять, что его хотелка не реализуема в общем случае, и похоже что так.

                                                                                  Это всё напоминает высказывание Пи по ручную оптимизацию кода с JIT

                                                                                  Как у машины на ходу руками подталкивать колёса, чтобы она быстрее ехала
                                                                                  Ответить
                                                                        • а еще перешивка уефа == потеря гарантии, лол
                                                                          Ответить
                                                                          • да ладно?

                                                                            а если я официальную прошивку поставил с сайта производителя?
                                                                            Ответить
                                                                            • Даже если ты открыл нубук – теряешь гарантию. По крайней мере много где так. А теперь сопоставь это по влиянию на систему с тем, что ты там что-то ещё зашил.

                                                                              Для официальной прошивки надо идти в сервисный центр и там официально её ставить.
                                                                              Ответить
                                                                              • Я один раз открывал ноутбук, и поцарапал винтики. Пришлось красить его краской для металла, лол

                                                                                лаком тоесть
                                                                                Ответить
                                                                            • будешь как с ведром - перед походом в сервис будешь шить как было в зад, если окирпичится
                                                                              Ответить
                                                                  • > знакомый
                                                                    не для меня, для друга

                                                                    добейся среднего напряжения на элементах 3.7 и сунь в холодильник
                                                                    так батареи пролонгируют и не иначе
                                                                    Ответить
                                                                    • ты реально думаешь, что я такой ебанутый?:)
                                                                      Ответить
                                                                      • > что я такой ебанутый

                                                                        Это же ГК... Тут критерии нормальности не работают.
                                                                        Ответить
                                                                        • я ебанутый, но не такой, а сякой
                                                                          Ответить
                                                                          • Ну кстати, а китайцы на его ноут запаску не выпускают? Всяко же есть на али...
                                                                            Ответить
                                                                            • да даже в обычном partsdirect есть, прямо у меня в городе
                                                                              Ответить
                                                                      • да ладно тебе, не стесняйся
                                                                        в крайнем случае файку выбросишь если ребята будут дразнить
                                                                        Ответить
                                                                  • Скажи, что эта работа для админов, а не программистов, он отъебётся.
                                                                    Ответить
                                                                    • я так не отвечаю, бо возиться с компами мне интересно
                                                                      Ответить
    • Я нашёл говно!
      using CombinationLock = NamedTuple<
          Field<"password", int>
      >;
      
      using PassLock = NamedTuple<
          Field<"password", std::string>
      >;
      
      CombinationLock l1 { 41205 };
      PassLock l2 { "11037" };
      
      auto multi_lock = mergeNamedTuples(l1, l2);

      Ни диагностики, ничего, второе поле просто пропадает.
      Ответить
      • Дублирующиеся поля ня проверяются, это нямеренно так. UB!

        Можня даже без merge, просто два поля с одиняковыми именями.
        Ответить
        • Тогда нужен инструмент, чтобы проверить наличие одинаковых полей и обматерить пользователя.

          Хотя идея мне нравится. Это не баг, это просто UB передавать такие данные
          Ответить
          • > Это не баг, это просто UB передавать такие данные
            Имення! Это C++-way.

            Ну ладня, ладня, ня: https://wandbox.org/permlink/ixfKOuydrjBl3U0E (какой кавай, почти 44 килобайта ошибок!). Повторения ищем за O(N^2) — компилятор крепкий, компилятор стерпит o(○`ω´○)9.
            template<StringLiteral Target, StringLiteral Head, StringLiteral... Tail>
            constexpr bool haveRepeatsImplPass()
            {
                if constexpr (Target == Head) {
                    return true;
                } else if constexpr (sizeof...(Tail) > 0) {
                    return haveRepeatsImplPass<Target, Tail...>();
                } else {
                    return false;
                }
            }
            
            template<StringLiteral Head, StringLiteral... Tail>
            constexpr bool haveRepeats()
            {
                if constexpr (sizeof...(Tail) == 0) {
                    return false;
                } else if constexpr (haveRepeatsImplPass<Head, Tail...>()) {
                    return true;
                } else {
                    return haveRepeats<Tail...>();
                }
            }
            
            template<typename... Fields>
            struct NamedTuple {
                static_assert(sizeof...(Fields) > 0, "Must have at least one field");
                static_assert(!haveRepeats<Fields::name...>(), "Field names must be unique");
            Ответить
      • > Я нашёл говно!

        Дальше не читал.
        Ответить
    • тупой libmagic не узнает SRecord
      Ответить

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