Кресты / Говнокод #27363 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 PolinaAksenova, (Updated )

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

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

                        Скриптушня должна быть динамической, иначе нахуй она вообще нужна?
                        Ответить
                                • А Леонардо и Микеланджело это черепашки ниндзя
                                  Ответить
                                      • А функциональный язык программирования — это когда есть функции.
                                        Ответить
                                        • Или так: функциональный язык это тоже джава, когда туда завезли лямбды

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

                                              >Логическое -- когда есть bool.
                                              (т.е. классическая сишка не подходит).
                                              Ответить
                                              • Ну если применить метаклассы в петоне, то будет декларативность. Я так декларативный бинарный парсер/райтер писал.
                                                Ответить
                                                • не изобрети случайно DSL, иначе тебя релоцируют в руби или груви
                                                  Ответить
                                                  • Не релоцируют, я работаю на себя. Изначально была цель написать свой вариант парсера/райтера в стиле либы Construct, которая неимоверно уебищна синтаксически.
                                                    Ответить
                                                • Патрульный корабль Береговой охраны ВМС Китая потопил вьетнамскую рыболовецкую шхуну у спорных Парасельских островов (островов Сиша), сообщает 3 апреля агентство DPA со ссылкой на источники в правительстве Вьетнама.
                                                  Ответить
                                                  • а есть острова тсиша, киша, пдкиша, аша, баша и бизибокса?
                                                    Ответить
                                                          • bash это ksh плюс кое-что из csh кмк изначально
                                                            Ответить
                                                          • оффтоп: Борманд, а в 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 и сунь в холодильник
                                                                  так батареи пролонгируют и не иначе
                                                                  Ответить
                                                                    • > что я такой ебанутый

                                                                      Это же ГК... Тут критерии нормальности не работают.
                                                                      Ответить
                                                                    • да ладно тебе, не стесняйся
                                                                      в крайнем случае файку выбросишь если ребята будут дразнить
                                                                      Ответить
                                                                • Скажи, что эта работа для админов, а не программистов, он отъебётся.
                                                                  Ответить
  • Я нашёл говно!
    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");
          Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8