1. Куча / Говнокод #27388

    +2

    1. 1
    Мир! Труд! Май!

    С праздником, питухи!

    Запостил: MAuCKuu_nemyx, 01 Мая 2021

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

    • Терпение и трут всё перетруд!
      Ответить
    • Поздравляю всех присутствующих! Мир! Труд! Май! Кавай!
      ☆*:.。.o(≧▽≦)o.。.:*☆
      Ответить
      • Я тебе покажу, щенок, как надо при матери разговаривать! Я тебе дам «майский жук»!
        Ответить
      • Кавай не нужен.
        Ответить
    • https://pbs.twimg.com/media/Ezo69oSXsAIyIl8.png
      Ответить
    • Ну чо, питухи, шашлычок жарили? Из курицы наверное? Или из свинины?
      Ответить
      • Курицу петух топтал, поросёнок пидор был. Надо говяжьи кушать.
        Ответить
        • Мало кто знает, в «курятине» петух тоже может попасться, причём с немалой вероятностью.
          Ответить
          • Примерно 50 на 50, да? То есть, если человек купит двух «курятин», то он 100% съест «петушатину»? Н-да, зря я употреблял в пищу кур...
            Ответить
            • Сразу видно, что ты безвузный
              Ответить
              • Представьте, что вы стали участником игры, в которой вам нужно выбрать одну из трёх дверей. За одной из дверей находится вкусная кура, за двумя другими дверями — зашкварная петушатина. Вы выбираете одну из дверей, например, номер 1, после этого ведущий, который знает, где находится кура, а где — питуля, открывает одну из оставшихся дверей, например, номер 3, за которой находится питуля. После этого он спрашивает вас — не желаете ли вы изменить свой выбор и выбрать дверь номер 2? Увеличатся ли ваши шансы отведать куры, если вы примете предложение ведущего и измените свой выбор?
                Ответить
                • Кстати, вот тут есть любители нахрюкнуть на кресты, мол, вот в математике всё логично, консистентно, а в крестах фу-фу-фу.

                  Но при этом:

                  Ещё более наглядной ситуация с дверями становится, если представить что дверей не 3, а, скажем 1000, и после выбора игрока ведущий убирает 998 лишних, оставляя 2 двери: ту, которую выбрал игрок и ещё одну. Представляется более очевидным, что вероятности нахождения приза за этими дверьми различны, и не равны 50%.

                  Так, подождите-ка:

                  <...> после этого ведущий, который знает, где находится кура, а где — питуля, открывает одну из оставшихся дверей <...>

                  0\
                  Ответить
                  • логичная и консистентная система не должна быть интуитивно понятной
                    Ответить
                  • А что здесь ня так?
                    Даны три двери: за двумя сидят петухи, за одной — куритса.
                    Шаг 1: я случайня выбираю дверь. Вероятность того, что за ней сидит куритса, равна 1/3.
                    Шаг 2: ведущий открывает дверь с петухом, которую я ня выбирала.
                    Шаг 3: теперь имеются две двери: за одной петух, за другой куритса. Вероятность того, что за выбранной на шаге 1 дверью сидит куритса, ня изменилась и равна 1/3 (поскольку с тех пор куритс ня двигали и двери с куритсами ня открывали). Но поскольку теперь куритса точно сидит за одной из двух дверей — вероятность того, что она сидит за ня выбранной дверью, равна (1 - 1/3) = 2/3.

                    Строгое математические доказательство утверждений ня шаге 3 можня получить анялизом пространства исходов, но в данном виде он няиболее прост и интуитивен.
                    Ответить
                    • > Шаг 1: я случайня выбираю дверь. Вероятность того, что за ней сидит куритса, равна 1/3.

                      Это не важно, ведь...

                      Шаг 2: ведущий открывает дверь с петухом {(или куритсей)}, которую я ня выбирала.

                      Таким образом, результат шагов 1 и 2 приводит к тому, что в результате у нас остаются две двери, за одной куритса, а за другой петух: шансы выбрать либо куритсу, либо петуха равны.

                      Есть же даже какая-то теорема, что одну формулу можно заменить на другую – эквивалентную – формулу. Вот я и заменил «выбрать дверь – убрать дверь – выбрать дверь» на «убрать дверь – выбрать дверь».
                      Ответить
                      • > {(или куритсей)}
                        Нет. Ведущий, зняющий о том, кто где няходится, всегда открывает дверь только с петухом.

                        Принципиальняя проблема в том, что шаг 2 зависит от шага 1. Нельзя их изменять и нядеяться на то, что результат останется прежним.

                        > «убрать дверь – выбрать дверь».
                        Удивительня, но если после открытия ведущим двери ты выберешь дверь случайня, то вероятность получить куритсу действительня будет равна 1/2.
                        Ответить
                        • > Фигню сморозила.

                          Да нет, так и будет 50/50 если монетку подбросить, забить на накопившуюся статистику и не думать.
                          Ответить
                          • Да, я снячала подумала, что из-за кривой вероятности там смещение будет, но нет, иняче бы у нас гаммирование ня работало бы.
                            Ответить
                        • > > {(или куритсей)}

                          Да, ты права, я напутал uwu

                          > Принципиальняя проблема в том, что шаг 2 зависит от шага 1.

                          Сначала мы выбираем одну дверь, там курица с вероятностью 1/3, это плохо. После этого нам открывают одного петуха.

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

                          Но что есть выбор? Может ли бездействие быть выбором, если оно было осознанным?
                          Ответить
                      • Фишка в том, что случайное событие тут только одно - изначальный выбор двери.

                        Второй выбор (менять или оставить) ты делаешь осознанно, со знанием некой инфы, а не бросанием монетки.
                        Ответить
                      • Без ограничения общности предположим, что выбрана первая дверь. Тогда возможны три равновероятных варианта: КПП, ПКП и ППК.

                        Ведущий открывает дверь с петухом и у нас остаётся К-П, ПК- и П-К.

                        Если мы сохраним наш выбор, то курица выпадет только в первом варианте. Если мы изменим наш выбор, то курица выпадет в джвух остальных. Поэтому менять выбор выгоднее.
                        Ответить
                        • > Ведущий открывает дверь с петухом и у нас остаётся К-П, ПК- и П-К.

                          КПП – К-П и КП-.
                          ПКП – -КП и ПК-.
                          ППК — -ПК и П-К.

                          Итого 6 кобенеций.

                          После того как мы выбираем дверь, например, первую, ведущий открывает петуха, итого у нас остаются четыре кобенеции:

                          К-П, КП-, ПК-, П-К.

                          Итак, из этой выборки видно, что у нас по две вореции, где петух на первом месте.

                          И ещё две вореции, где нужно изменить выбор.

                          Вероятность 50/50, что я делаю не так?
                          Ответить
                          • Бля, ты вынуждаешь меня взять coq и формально доказать эту хуйню...

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

                            ППК ведёт к одной кобенации — П-К, ПКП — к ПК-. КПП ведёт к двум, между которыми ведущий делает случайный выбор → КПП с вероятностью 0,5 ведёт к КП- и с вероятностью 0,5 к К-П.

                            И вообще, напитонь скрипт и воспользуйся Монте-Карло.
                            Ответить
                            • > Не учтено, что К-П и КП- не равновероятны остальным кобенациям.

                              Равновероятны!

                              Вот у нас все возможные кобенации, если мы выбираем первую дверь (её ведущий не сможет открыть):

                              КПП – К-П и КП-.
                              ПКП – ПК-.
                              ППК – П-К.

                              Меня тоже немного напрягает то, что для КПП есть два варианта. Но ведь ведущий может случайно выбрать один из них, значит их оба надо считать.

                              > И вообще, напитонь скрипт и воспользуйся Монте-Карло.

                              А это хорошая идея!
                              Ответить
                              • > Равновероятны!

                                Да схуя? Было по 1/3 на КПП, ПКП и ППК. Затем (!) ведущий убрал петуха, и мы получили К-П (1/6), КП- (1/6), ПК- (1/3), П-К (1/3).

                                Т.е. оставляя выбор первой двери мы получаем 1/6 + 1/6 = 1/3, а меняя выбор мы получаем 1/3 + 1/3 = 2/3.
                                Ответить
                                • И правда! Такого я не заметил. Значит, если мы не изменим выбор, то вероятность будет (2/6), т.е. (1/3), а если изменим, то будет (2/3), я правильно понимаю?
                                  Ответить
                                  • Ну да, в моём комменте так и написано.
                                    Ответить
                                    • Теперь всё понятно. Какая же математика интересная, даже интереснее крестов порою! Спасибо большое, что помог с домашкой!
                                      Ответить
                              • > Меня тоже немного напрягает то, что для КПП есть два варианта

                                Вот именно это и делает эти две кобенации неравновероятны. Сумма вероятностей всех взаимоисключающих событий могущих наступить в результате испытания должна быть равна 1.
                                Для кобенации ПКП существует только одно событие — ПК-, которое наступает с вероятностью 1.0.
                                Для кобенации КПП существует два равновероятных события, каждое с вероятностью 0,5.

                                Если взять, что все три оригинальных кобенации равновероятны по условию (с вероятностью 1/3), то шансы всех итоговых кобенаций:

                                КП- = 1/3 * 1/2 = 1/6
                                К-П = 1/3 * 1/2 = 1/6
                                ПК- = 1/3 * 1 = 1/3
                                П-К = 1/3 * 1 = 1/3

                                Проверяем, что сумма вероятностей равна 1: 1/6+1/6+1/3+1/3 == 1/6+1/6+2/6+2/6 == 6/6 == 1
                                Ответить
                                • Да, всё так. Именно поэтому я за построение полного комбинаторного дерева, чтобы нигде не ошибиться.
                                  Ответить
                                  • С вероятностью 1/3 я изнячально выбрала дверь с куритсей. Тогда, поменяв двери, я уйду без куритсы.
                                    С вероятностью 2/3 я изнячально выбрала дверь с петухом. Тогда, поменяв двери, я уйду с куритсей, поскольку у ведущего будет только одня дверь с петухом.
                                    Ответить
                • Эта задача изначально про козла была вроде как.

                  https://en.wikipedia.org/wiki/Monty_Hall_problem
                  Ответить
                  • Для основной массы заключенных козлы являются предателями интересов сообщества заключенных, коллаборационистами.

                    Видимо, заменили козлов на самокаты, чтобы ма-те-ма-ти-ку не зашкварить.
                    Ответить
                  • Goat это Коза, а Козел — деревня в Жлобинском районе
                    Ответить
                • > ведущий

                  Смотрящий же.
                  Ответить
                  • Значит вот расклад: в одной камере твой кент, в двух других по стулу, на одном стуле...
                    Ответить
                • Вас двое участников. Перед вами по одной большой закрытой клетке с цыплятами. Известно, что в одной клетке в 2 раза больше цыплят, чем во второй. Каждый участник смотрит только в свою клетку сколько ему попалось цыплят.
                  Далее участникам предлагается решить, стоит ли обменяться не глядя. Они рассуждают так:
                  В чужой клетке равновероятно может находиться X/2 и 2*X цыплят, в среднем это (X/2 + 2*X)/2 = 5/4 * X. Поэтому решают поменяться.
                  Ответить
                  • Ответить
                  • Видимый парадокс вознякает из-за няопределённости в случае, когда один решает поменяться, а другой — нет.
                    Упростим ситуацию: есть клетка с X цыплятами, есть монетка. Я подбрасываю монетку, если выпадает орёл — клетку ополовинивают, если выпадает решка — клетку увеличивают вдвое.
                    В случае одного броска я с вероятностью 1/2 потеряю X/2 цыплят, а с вероятностью 1/2 — получу X дополнительных, то есть матожидание положительня. В теории, подбросив монетку достаточное количество раз, я получу няограниченное количество цыплят, одняко ня практике, как только у меня останется 1 цыплёнок, я потеряю всё и более ня смогу участвовать в увлекательной лотерее.

                    В сущности, это практически один в один система Мартингейла (https://ru.wikipedia.org/wiki/Мартингейл), в который мы делаем удваивающиеся ставки и, в теории, всегда должны выигрывать нячальную ставку, однако в реальности (при ограниченном нячальном капитале) нябольшая вероятностью полностью разориться компенсирует нянулевое матожидание отдельных ставок.
                    Ответить
                    • Там нет порадокса. Есть ошибка в рассуждениях.
                      Ответить
                      • Так ведь фактических ошибок в рассуждениях нят. Матожидание итогового количества цыплят от действия «обменять клетку» для каждого из игроков действительня больше их X.
                        Ответить
                        • Нет, ошибка есть. Позже напишу, если не найдёшь.
                          Ответить
                          • Нямекаешь на то, что эксперимент не сбрасывается? Тогда действительня, есть клетки X и 2*X, если я ня обменяюсь, то уйду с E = (1/2 * X) + (1/2 * 2*X) = 3/2 * X цыплятами, если обменяюсь, то уйду с E = (1/2 * 2*X) + (1/2 * X) = 3/2 * X.
                            Но это ошибка в описании эксперимента. Если после обмена я могу забрать клетку и идти играть с новым соперником (при том, что изнячальный инвариант о количестве цыплят у соперника будет сохраняться), то мне действительня будет выгоднее меняться (опять же, при условии, что цыплят можня делить няограниченно долго).
                            Ответить
                            • Эм, если ты ня обменяешься, то ты уйдёшь с Х цыплятами. Откуда 3/2 * X то?

                              З.Ы. А, понятно, Х это не твои, а тупо меньшая клетка.
                              Ответить
                            • В чужое клетке правда в среднем 5/4 * X цыплят. Но я ведь меняюсь, а не забираю чужую клетку :)
                              Нужно ещё вычесть сколько я отдам.
                              Ответить
                              • > Нужно ещё вычесть сколько я отдам.

                                А что это меняет? Ну будет у тебя матожидание профита 1/4 * X (либо получаешь ещё X либо теряешь X/2). Т.е. тут ещё нагляднее видно, что меняться выгоднее, лол.
                                Ответить
                                • Блядь, я теперь тоже запутался. Кажется понял почему ты ванишнул )))
                                  Ответить
                                  • Ну у Полины правильный ответ, имхо.

                                    Клетки же заранее существовали, независимо от того будешь ты меняться или нет. Поэтому у тебя сейчас либо N либо 2 * N. А у противника либо 2 * N либо N. И матожидание всегда 1.5 * N. Хоть меняйся хоть нет.

                                    эскобар.чпег

                                    З.Ы. А число цыплят, которых ты видишь в своей клетке, оно вообще ни на что не влияет. Ты не можешь принять на основе его какое-то решение. Разве что если оно нечётное, а цыплят половинить нельзя...
                                    Ответить
                                • Если я поменяюсь, то я получу Y цыплят. Соответствено отдам в среднем (Y/2 + 2*Y)/2 = 5/4 * Y. Не, не буду меняться.
                                  Ответить
                    • > как только останется 1 цыплёнок, я потеряю всё

                      Это потому что он целочисленный, надо было вещественного брать.
                      Ответить
                    • В реальном казино всё ещё портит наличие минимальной и максимальной ставки. И наличие 0 слегка роняет матожидание.
                      Ответить
                    • Кстати, если цеплята неделимы, то меняться может быть невыгодно...

                      Возьмём такую стратегию: если моя корзина нечетна, то меняемся иначе нет.

                      Если противник действует по такой же стратегии, то обмена никогда не будет, что в общем-то и пофиг, уйдём со своими 3/2 * N. Если же противник действует по наивной стратегии и всегда меняется, то моё матожидание будет:

                      - меньшая корзина (N) нечетна и она у меня, меняемся: 1/4 * 2 * N
                      - меньшая корзина четна и она у меня, не меняемся: 1/4 * N
                      - меньшая корзина у противника, не меняемся: 2/4 * 2 * N

                      Итого получаем 7/4 * N против наивного противника.

                      Т.е. при чётном количестве цеплят выгоднее не меняться.
                      Ответить
                      • И вот тут мы упираемся в ситуацию, где как выбирается количество цыплят становится важным. Если цыплят в меньшей корзине всегда четное количество, то рассуждение неправильно.
                        Ответить
                        • > рассуждение неправильно

                          Если в меньшей всегда чётное, то я никогда не меняюсь и получается обычный эскобар с 3.2 * N. Т.е. этот алгоритм всё равно остаётся не хуже наивных стратегий (всегда менять или никогда не менять).
                          Ответить
                        • > количество цыплят становится важным.

                          Вообще говоря нет.

                          Если оно чётное, то никто не может сделать обоснованный выбор и оба уходят с с одинаковой суммой (в среднем, как рандом ляжет).

                          Если оно нечётное, то:
                          - предлагая обмен, когда у тебя нечётное количество цыплят, ты либо ничего не теряешь либо выигрываешь;
                          - принимая обмен от противника, когда у тебя чётное количество цыплят, ты либо ничего не получаешь либо проигрываешь.

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

                              - меняемся, если у нас гарантированно меньшая корзина (зависит от различных ограничений на количество цеплят в корзинах)
                              - иначе не меняемся
                              Ответить
                              • А если с другой стороны сидит жук-пидор, который всех цыплят напугал и парочку вообще вытянул из клетки? Лучше не меняться.
                                Ответить
                      • > Т.е. при чётном количестве цеплят выгоднее не меняться.
                        С другой стороны, нечётная корзина неделимых цыплят в любом случае будет минимальной, поэтому её гарантированно выгоднее обме-ня-ть.
                        Ответить
                  • > равновероятно

                    [citation needed]
                    Ответить
                    • Ну клеток же две. Либо мне досталась большая либо маленькая.

                      Понятно, что если у меня нечетное число цыплят, то наверное это маленькая... Но если взять 4 и 8, то всё честно.
                      Ответить
                • Нужно изменять выбор.
                  Совершенно контринтуитивно, но верно математически.

                  Математика -- сложная штука. Хорошо, что я не настоящий программист, и не обязан её знать
                  Ответить
    • Arbeiten May Frei
      Ответить
    • А вы освятили куличи и яйца, питухи?
      Ответить
    • https://twitter.com/ShitUserStory
      Ответить
    • "If it wasn't for C, we'd be writing programs in BASI, PASAL, and OBOL." – Unknown
      Ответить
    • ну и о грустном
      "Any application that can be written in JavaScript, will eventually be written in JavaScript"
      Ответить
      • Стесняюсь признаться, не понимаю, как это связано с темой оффтопа?
        Ответить
    • Вот это очень смешно, конечно:

      This kind of iterator has a special state as an end-of-stream iterator, which is acquired if an input operations fails (as returned by fail after an operation with the associated stream), and is also the resulting value of a default-constructed object.


      типа
      // 
      	const std::istream_iterator<int> ololo_pysh_pysh_rialne;
      	std::istream_iterator<int> it(std::cin);
      	std::vector<int> c;
      	std::copy_if(it, ololo_pysh_pysh_rialne, std::back_inserter(c), &odd);
      Ответить
      • И что смешного?
        Ответить
        • and is also the resulting value of a default-constructed object.

          Ну я ожидал бы какой-то статический метод там, или конст поле?
          Ответить
          • >copy_if
            Кстати, этот код работал еще в 2003-м году. Угадайте, как бы это сделал в то время джавист без даже указателей на метод.
            Джава умудрилась иметь МЕНЬШЕ плюшек, чем более низкоуровневые кресты
            Ответить
          • > and is also the resulting value of a default-constructed object

            Ну а где тебе ещё end() взять? Отдельный статический метод прикручивать, который его возвращает? И так сойдёт, имхо.
            Ответить
            • ну типа да)

              Может быть крестовики уже ничему не удивляются, как английские джентльмены, но для жабоёба это "wat"
              Ответить
              • Ну "дефолтно-сконструированное" обычно означает "пустое, невалидное". Т.е., к примеру, пустой вектор или ещё не открытый файл. Поэтому как ещё трактовать сравнение с "дефолтно-сконструированным" итератором? Как UB?
                Ответить
                • Зачем давать пользователю создавать такой istream_iterator без стрима?
                  Ответить
                  • Зачем давать возможность создавать любой другой итератор без вектора, мапы, и т.п.? Потому что иногда хочется запилить переменную и не инициализировать её сразу.

                    Но там его использование -- вообще UB, да.
                    Ответить
                    • >Потому что иногда хочется запилить переменную и не инициализировать её сразу.

                      Пуристы ООП обычно за такое ругают
                      Ответить
                      • > Пуристы ООП

                        Ага, а потом у этих пуристов ООП в строке (!) есть метод join() для массива (!).

                        Какое single responsibility )))

                        З.Ы. Именно поэтому меня не особо ебёт мнение этих двоемыслящих.
                        Ответить
                        • Ну вообще конструктор для того и нужен, чтобы создавать объект в нормальном состоянии.

                          Просто это не всегда возможно...
                          Ответить
              • Вообще, красиво было бы объявить пару std::begin() и std::end() для стрима. Тогда даже c++11 for по стриму работать будет как в питоне. Но когда этот итератор делали, таких функций ещё не было.

                Хотя блин, а как туда тип элемента просунуть.
                Ответить
                • auto foo = cin.as_typed_stream<int>(); //стрим, он же и итератор
                  int q = *foo;
                  foo++;

                  например так
                  Ответить
                  • Это begin(), а end() где? Ну я понял идею, но это некрасиво.

                    Проще тогда вернуть из as_typed_stream некий прокси-класс для которого есть std::begin() и std::end(). Тогда можно будет просунуть в с++11 фор. Ну и я всё-таки за свободную функцию, а не метод. Метод здесь вообще ни к чему, возможность читать инты в текстовом представлении -- это не фича стрима и портит single responsibility.
                    Ответить
                    • end там же)

                      >Ну и я всё-таки за свободную функцию, а не метод
                      я когда писал, думал про extension methods) конечно, срать в ios не нужно
                      Ответить
                  • Вопрос в том, как заставить работать это:
                    for(int i: std::cin) {}
                    Ответить
                    • Нужно сделать перегрузку по возвращаему значению.

                      У нас в Perl это называется "контекст".
                      Ответить
    • https://www.rozhkov.me/ide-vs-editor/

      Намагався перейти на VScode, бо безкоштовно і соціум тиснув (усі в команді тєрєбонькали на нього). Протримався пару днів, трохи не здурів, купив ліцензію на WebStorm і горя не знаю
      Ответить
      • Подумал там очередная шутка про развод Гейтса.
        Ответить
        • Ещё как развели: чувак попользовал его штуку для кодинга, а в итоге купил вебшторм.
          Ответить
    • Активное распространение клиентоцентричной и продуктовой модели управления, глобализация, диджитализация и цифровизация бизнеса серьезно изменили терминологию менеджмента. Customer Experience, Journey Map, дизайн-мышление, трафик и уникальный посетитель — уже не узкие понятия, используемые лишь в кругу маркетологов, аналитиков и веб-дизайнеров.
      Ответить
    • Интересно, каким образом студия понимает, что в emplace и make_uniq/shared нужно передавать те же аргументы, что и в конструктор класса?

      Если я верно понимаю, то магия inplace работает через parameter pack и perfect forward (понимание reference collapsing нанесло мне псих. травму, кстати)


      Если я напишу свою питушн.
      template <class T, class... Args>
      void foo(Args&&... a)
      {
      	T(std::forward<Args>(a)...);
      }

      то студия ничерта не подсказывает аргументы Foo при вызове
      foo<Foo>(хуй);


      А для make_юник и emplace подсвечивает.

      Она просто хорошо знает stl, или мне нужно как-то ей помочь?
      Ответить
      • Просто захардкодили.
        https://devblogs.microsoft.com/cppblog/intellisense-improvements-in-visual-studio-2019/

        > One piece of community feedback that we have received has been to improve the IntelliSense for perfect forwarding templates in C++. We’ve taken the first steps towards that by improving the way a few perfect forwarding templates in the STL are handled. In particular, make_unique, make_shared, emplace, and emplace_back.

        > Here is how this looked before: []
        > Notice how the parameter help doesn’t list the actual parameters of your type. In the latest version of Visual Studio, it is much more convenient: []

        >We don’t want to stop with just these four STL functions though. We are investigating ways to support your own perfect forwarding templates here as well.
        Ответить
        • Хм, у меня в 2017 подсвечивает. Видать, решарпер начудил

          >We are investigating ways
          волшебным комментом?:)

          А в 20 нельзя как-то более красиво это выразить, кстати?
          Нету чего-то типа

          foo(std::args<T>...)
          ?
          Ответить
          • Возможня, бэкпортнули. Ну или решарпер, да.

            > волшебным комментом?:)
            Эвристикой, как вариант. Если есть parameter pack, и соответствующие этому паку аргументы передаются в какой-нибудь конструктор T::T(), а потом сконструированный объект возвращается — подсвечиваем параметры T::T().

            > А в 20 нельзя как-то более красиво это выразить, кстати?
            Так это ня языковая фича, это чисто фишки IDE. Ня уровне языка оно всё красиво работает.
            Нят, в принципе, можня придумать какой-нябудь [[creates<T>(args)]], но это какой-то няркоманией попахивает. Слишком редкий кейс, мне кажется.
            Ответить
      • Ну и да, с введением class template deduction guides все эти make_xxx становятся практически ня нужными. Из нядавнего примера:
        template<typename T, typename F>
        struct Promise {
            Promise(const F & func) : f(func) {}
        
            T resolve()
            {
                return f();
            }
        
            F f;
        };
        
        // Тут
        template<typename F>
        Promise(const F & func) -> Promise<decltype(func()), F>;
        
        int main()
        {
            auto promise = Promise([]() { return 16.1f; });
            auto result = promise.resolve();
            static_assert(std::is_same_v<decltype(result), float>);
        
            std::cout << "result == " << result << std::endl;
        }

        При помощи CTAD можня выводить типы шаблона ня основе типов переданных в конструктор знячений: в данном случае, няпример, мы говорим, что если в конструктор Promise передаётся функтор (объект с перегруженным operator()) func типа F, то первым параметром результирующего шаблона будет тип, возвращаемый этим функтором, а вторым — тип F.
        Таким образом, няпример, в современных крестах можня создавать unique_ptr простым вызовом конструктора: "std::unique_ptr(new T(...));".

        У CTAD есть и ограничения: параметры шаблона deduction guide'а должны целиком выводиться из типов аргументов конструктора. Если мы хотим сделать параметризуемый пользователем шаблон, например, вот так:
        template<int X, typename T>
        SomeClass(T t) -> SomeClass<X, T>;  // Ня сработает
        // ...
        auto obj = SomeClass<16>(new Bar);

        То придётся возвращаться к make_***:
        template<int X, typename T>
        SomeClass<X, T> make_some_class(T t) {...}
        // ...
        auto obj = make_some_class<16>(new Bar);  // Сработает
        Ответить

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