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

    +166

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    template <typename RetT> RetT Max() { return (RetT)0; }
    
    template <typename RetT, typename ArgT, typename ... Args> RetT Max(ArgT Arg1, Args ... args)
    { RetT Temp = Max<RetT>(args ...); return ((RetT)Arg1 > Temp) ? ((RetT)Arg1) : (Temp); }
    
    int main(int argc, char* argv[])
    {
        printf("%d\n", Max<int>(100, 200.356, false, -300));
        return 0;
    }

    оцените полет человеческой мысли и чудеса нового стандарта С++0x... семпл мой, правда довольно редко используется...

    Запостил: ReL, 19 Апреля 2011

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

    • если все числа будут отрицательными то ответ будет 0, что не верно...
      Ответить
      • Надо бы что-то типа RetT::minValue в первую строку
        Ответить
        • если параметр один, то его принимать за минимум, то есть переписать первый шаблон, под один параметр...
          Ответить
          • Для одного - да. Но в первой строке ноль параметров.
            Ответить
      • если все числа будут отрицательными, то ответ будет ноль, и это верно... если все числа будут отрицательными, а RetType будет беззнаковым, то числа будут сравниваться по модулю и это тоже правильно...
        Ответить
        • 0 будет просто самым боль шим из них, но это не будет правильный ответ, так как можно было бы заменить этот код на возврат MAX_INT и он всегда будет больше чем все что туда передают...
          Ответить
          • >но это не будет правильный ответ
            почему это?
            Ответить
            • потому что тебе нужно максимальное из приведенных тобою чисел...
              Ответить
              • блеать))) я чет протупил)))
                в таком случае надо ограничивать рекурсию до одного параметра)))
                Ответить
            • иначе можешь заменить свой код на = MAX_INT,
              Ответить
              • какую часть кода?
                Ответить
              • ну INT_MAX это не элегантное решение, лучше имхо ограничить рекурсию))) хотя о чем мы говорим, ведь это - говнокод, чтобы быть говнокодом, ему не нужны усовершенствования)))
                Ответить
          • Во-первых, 'INT_MAX', а не 'MAX_INT'.
            Во-вторых, 'INT_MAX' больше, чем что угодно? А про тип 'unsigned int' вы слышали, с максимальным значением 'UINT_MAX'? А как насчет 'LONG_MAX'? 'LLONG_MAX'? А есть еще 'DBL_MAX'...

            Если уж идти по тому пути, который избрал автор, то возвращать надо бы 'std::numeric_limits<RetT>::max()'.
            Ответить
        • Если все числа отрицательные, то максимальное из них равно нулю??? Я либо что-то пропустил в математике, либо это какой-то новый софизм...

          Что же касается фразы "будут сравниваться по модулю", то тут надо следить за терминологией. В русском языке "сравнивать по модулю" означает сравнивать абсолютные величины чисел. Т.е. '-5' по модулю больше, чем '-2'. Такого сравнения, разумеется, в данном случае никак не получится если 'RetT' беззнаков и входные числа отрицательны.

          Как тут лучше правильно сказать по-русски я навскидку даже и не соображу... Может сказать, что если 'RetT' беззнаков, то все отрицательные операнды будут [i]проинтерпретированы по модулю 2^N[i] (где N - количество битов в беззнаковом типе).
          Ответить
    • кто нибудь проверял, разворачивается ли это в компайл тайме? и для каких типов...
      Ответить
    • Чем они занимаются? Идиоты и клоуны. НИКОГДА в крестах не будет вычислений на тайплевеле. Вот какой смысл в этих анальных шуточках с макроэкспандером? Только концентрацию говна в языке повысили.
      Ответить
      • Разрешите попросить вас более подробно разъяснить, что вы имеете в виду.
        Ответить
        • Что тут разъяснять? Темплейты крестов всего лишь сбоку прикрученный макроэкспандер (оно даже в AST не может, ржач да и только).
          Далее. Лямбда-исчисление на тайплевеле.
          {-# OPTIONS -fglasgow-exts #-}
           data X
           data App t u
           data Lam t
           
           class Subst s t u | s t -> u
           instance Subst X u u
           instance (Subst s u s', Subst t u t') => Subst (App s t) u (App s' t')
           instance Subst (Lam t) u (Lam t)
           
           class Apply s t u | s t -> u
           instance (Subst s t u, Eval u u') => Apply (Lam s) t u'
           
           class Eval t u | t -> u
           instance Eval X X
           instance Eval (Lam t) (Lam t)
           instance (Eval s s', Apply s' t u) => Eval (App s t) u


          Test:
          > :t undefined :: Eval (App (Lam X) X) u => u
           undefined :: Eval (App (Lam X) X) u => u :: X
          
          Fixed-point:
          > :t undefined :: Eval (App (Lam (App X X)) (Lam (App X X)) ) u => u
           ^CInterrupted.

          Комментарии излишни. Но это совсем простенький примерчик и реализован в лоб. А вот так Олег Киселев опускает адептов крестов в 3 строчки: http://okmij.org/ftp/Computation/lambda-calc.html#haskell-type-level
          Ответить
          • "Опускает"... Душит смех. Это бредятина из разряда "опускания крестов" по принципу "я в языке Лого могу квадрат черепашкой за 4 команды нарисовать, а в крестах затрахаешься ковыряться".
            Ответить
            • http://bit.ly/bpOPH6

              Почему у вас такая ОБИДА при соприкосновении с настоящим программированием и CS?
              Ответить
              • Да что вы, какая обида? У вас, наверное, русский - второй язык и слово "смех" вы както-то неправильно перевели. "Душит смех" - это совсем не обида :) Это, скорее, радость. Ничем не замутненная радость за настоящее программирование настоящих логопрограммистов :))
                Ответить
                • показать все, что скрытоНу слился и слился. Зачем все эти слезные оправдания? Не первый и не последний фанбой осиливший лишь перекладывание байтиков.
                  Ответить
                  • Ха ха ха... Тин детектед! Отчетливо просматривается горящее подростковое желание использовать на практике найденную где-то картинку с "баттхертом" и применить слово "слился" в предложении :) А повод все не предоставлялся и не предоставлялся... Ничего, тин и без повода запросто применит! Молодцом, красава!
                    Ответить
                    • Как известно, байтоеб конструктивно ответить не в состоянии, зато не прочь провести незамысловатый демагогический прием - уведение разговора в сторону, отчаянно пытаясь прикрыть свой зад.
                      Повторю тезис - кресты CANT INTO вычисления на тайплевеле.
                      Ответить
                      • Уведение разговора в сторону... Прокручивам ветку вверх и пытаемся догадаться, откуда в разговоре взялись какие-то "вычисления на тайплевеле" :)))

                        Кстати, "CANT INTO" - это на каким языке? (Заранее извиняюсь за "уведение разговора в сторону" :))
                        Ответить
          • а зачем это повторять на С++?
            Ответить
            • Вопрос `зачем' был бы корректен, если на экскрементах Страуса можно было аналог реализовать.
              А так... Язык для перекладывания байтов, что с него взять.
              Ответить
              • зато ниодин язык даже близко не приблизился по производительности к "экскрементам страуса"...
                Ответить
                • Мокрая_мечта_фанбоя.png

                  http://www.ffconsultancy.com/languages/ray_tracer/comparison.html

                  ps Все утечки уже пофиксил?
                  Ответить
                  • круто... всегда находится один пример, где некий язык круче С++... всегда радовал этот факт...
                    вот все жду, когда убийцу крайзиса напишут на окамле...
                    Ответить
                    • Игрун в треде - все в монаду!

                      ---
                      Гей-дев это тупой конвеер. Там не нужны надежные и проверенные решения. Выпускай говно в срок и радуйся. Очень тупой конвеер.
                      Ответить
                      • ох-ох, откудаж ты такой умный? неужели веб программист?
                        Ответить
                  • к стати очень влобная реализация, и примерив это http://research.scee.net/files/presentations/gcapaustralia09/Pitfalls_of_Object_Oriented_Programming_ GCAP_09.pdf
                    можно существенно ускорить версию на С++, а если отказаться от виртуального вызова, то еще более существенно... что может предложить окамл в плане оптимизаций...
                    Ответить
                    • `что может предложить окамл в плане оптимизаций...'

                      man MLton
                      man алгоритмические оптимизации
                      man rewriting using the monad/functor laws

                      Перекладывай байтики, не отвлекайся. Рабовладелец будет недоволен.
                      Ответить
                      • о круто...
                        первое отпадает ибо чел юзал ocamlopt, что уже является компилятором...
                        второе возможно в С++ причем в более извращенной форме, с учетом особенностей оборудования (заметь в высокопроизводительной части есть виртуальные вызовы и грамотная статическая типизация их может зарешать)
                        ну и 3 опять таки возможно в С++...

                        то есть имеем типичный рекламный тест, где берется самая оптимальная реализация на "best language" и кусок говнокода на С++...
                        и к стати не показан расход памяти для обоих программ, уверен что С++ версия обходит конкурента даже не на проценты а в разы...

                        ну а теперь плескай опытом... какую крутую фичу писал на сем чуде или оно до сих пор не востребовано?
                        Ответить
                        • `ну и 3 опять таки возможно в С++...`

                          Нет, фанбой, невозможно, да ты даже не знаешь, что это. Prove me wrong.

                          `уверен что С++ версия обходит конкурента даже не на проценты а в разы...'

                          По количеству утечек на строку.

                          ps И разорванная нижняя дырка и `сперва добейся' все в один пост собрал,
                          Ответить
                          • ну так объясни, как ты собрался этим оптимизировать... ибо я тоже могу плескать умными англосаксонскими словами в тред...
                            Ответить
                            • Q.E.D. Следующий.
                              Ответить
                              • ох как круто... а выплеснуть свой опыт на общественность наверное слабо?
                                или боишься что окажется что твой начальник сэкономил не взяв уровневого байтоеба, в надежде на то, что твои фейлы можно исправить, докупив более мощный проц и еще пару планок оперативки?
                                Ответить
                    • `Pitfalls_of_Object_Oriented_Programming _ GCAP_09.pdf`

                      У Вас паттерны с губы свисают.
                      Ответить
                      • кросавец... а каникулы разве не закончились?
                        Ответить
              • а ну-ка выложи аналог на лиспе вот этого

                http://ru.wikipedia.org/wiki/Linux_(ядро)
                или этого
                http://ru.wikipedia.org/wiki/Haiku-OS
                ну или этого
                http://ru.wikipedia.org/wiki/Microsoft_Windows

                ну или хотя бы возможность существования подобного на лиспе...
                Ответить
                • причем это
                  http://ru.wikipedia.org/wiki/L4_(микроядро)
                  http://ru.wikipedia.org/wiki/Haiku-OS
                  http://ru.wikipedia.org/wiki/Symbian_OS

                  реализовано на "экскрементах страуструпа" практически полностью...
                  Ответить
                • `на лиспе'? Ок, здесь сходу рабатает 10 правило Гринспуна.

                  Не говоря про http://en.wikipedia.org/wiki/Lisp_machine
                  Ответить
                  • круто! а что-то поживее? или оно там рядом с убийцей крайзиса пылится?
                    Ответить
      • вычисление в компайлтайме бесполезны, с этим я согласен... но вот допустим в компайлтайме шифровать строки или брать хеш от них, или же вызывать апи по хешу довольно удобно... особенно для всяких малварщиков)
        Ответить
        • Вычисления в `компайлтайм' -> http://govnokod.ru/6394#comment82633
          Ответить
          • и? на мой взгляд не "Комментарии излишни", а коммент82633 абсолютно излишен) на этот коммент можно ответить только эпическое "нахера это здесь?")))
            Ответить
            • Бедняша... Решил словоблудием утихомирить разбушевавшийся геморрой.
              Только никто крестовых фанбоев всерьез воспринимать не станет: демагогию развести может каждый, но факт остается фактом - повторить вышеприведенный пример на CPP невозможно.
              Ответить
              • Много чего нельзя повторить на разных языках. Но они же к этому и не стремятся, не?
                Ответить
                • показать все, что скрытоЗато некоторые `языки' стремятся накормить `программистов' на них максимальным объемом гомна.
                  Ответить
                  • (Глубокомысленно в сторону зрителям: Кто-то тут упоминал баттхерт...
                    Зрители сочувственно кивают в ответ)
                    Ответить
                  • люто тебя прихватило... может к врачу сходишь?
                    Ответить
                  • речь о пэхапэ?
                    Ответить
                  • Все фанбои сбежались в тред. Столько боли из-за такой незамысловатой фразы.
                    Ответить
                    • На самом деле, тут просто лиспофагов и функциональщиков не любят, минусуют и пытаются травить.
                      Давно замечено.
                      Ответить
                      • Просто всё дело в слепом рвении одних доказать что С/С++ говно и ничего не умеет, не зная при этом, что каждому языку свое место применения. Минусуют не функциональщиков, а горлопанов, отрешенных от реального мира и повседневных задач.
                        Ответить
    • вывод из всего прочитанного:
      guest - http://govnokod.ru/user/1
      ну полный кретин йобана....
      Ответить
    • Новый стандарт требует Говнокод 2.0!
      Ответить
    • О, приношу попкорн. Ну что там дальше? С++ VS Delphi?
      Дельфи говно.
      Ответить
      • полностью согласен... "анальный" паскальчик (с)
        Ответить
      • Эй, тут кто-то сказал, что Делфи говно? РЕКВЕСТИРУЮ ТОННЫ НЕНАВИСТИ!!!!1!
        Ответить
      • Сионанисты vs. Паскальсты. Старый срач. Т-О-Л-С-Т-О!!!1
        Ответить

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