C++ lectures at MIPT (in Russian). Lecture 7. Variadic templates.

Поділитися
Вставка
  • Опубліковано 18 гру 2024

КОМЕНТАРІ • 19

  • @Robinzon__Kruzo
    @Robinzon__Kruzo 4 роки тому +6

    На 36:32 вы просили подумать над проблемой последнего пробела в функции print_all для переменного числа параметров. Поскольку в комментариях никто не отписался по этому поводу, то тогда я напишу. Самый тупой вариант решения такой: разбить пачку аргументов на первый и остальные. Тогда первый аргумент просто выводится в cout без обертки, а остальные выводятся в cout в обертке, которая добавляет пробел перед ними. Но у этого способа есть проблема: в исходную функцию можно вообще не передавать аргументы, а в этой должен быть хотя бы один аргумент (первый, который я указал явно), иначе будет ошибка компиляции. Чтобы это обойти, я перегрузил функцию print_all для пустого списка аргумент. Именно поэтому это тупой вариант решения, на мой взгляд. То есть в итоге код будет такой:
    template
    class AddLeadSep {
    public:
    AddLeadSep(const T& ref_p, const char sep_p) : ref(ref_p), sep(sep_p) {
    }
    friend std::ostream& operator

  • @samolisov
    @samolisov 3 роки тому +2

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

  • @hiler844
    @hiler844 3 роки тому +1

    36:21. Для оператора

  • @ruslanyunusov8499
    @ruslanyunusov8499 3 роки тому +1

    к 20 слайду
    template
    Node *tree_get(Node *top, Args... args) {
    return (top ->* ... ->* args);
    }
    Node t;
    auto left = &Node::left;
    auto right = &Node::right;

  • @namydna78
    @namydna78 4 місяці тому

    Много времени прошло, но вы просили подумать над проблемой последнего пробела тех кто смотрит на ютубе...
    можно перегрузить friend std::ostream& operator

  • @l2pick
    @l2pick 4 роки тому +3

    Вот такую грязь придумал к 36:32.
    template
    void print_all(Args... args) {
    int s = 0;
    (std::cout

  • @victormustya1745
    @victormustya1745 5 років тому +1

    Касательно emplace:
    1. До 2011 года не было unique_ptr, так что auto_ptr было нашим всем.
    2. Всё-таки heap inderection к branch predictor unit не относится --- это не переход. Оно относится к hardware prefetch unit.

    • @tilir
      @tilir  5 років тому

      Насчёт auto_ptr, им в 2000-х пользоваться считалось крайне дурным тоном, см. книги Майерса например.
      По поводу (2) -- можно таймлайн когда это было? Я может быть внесу фикс в еррату.

    • @victormustya1745
      @victormustya1745 5 років тому +1

      @@tilir это всё было начиная примерно с 45:36. А про auto_ptr, понятно, что это дурной тон, но других вариантов-то не было в стандарте. unique_ptr только в новом стандарте появился (-:

  • @theswere
    @theswere 4 роки тому

    Для 19-го слайда у меня получилось:
    template void print_all(T... args) {
    auto sz = sizeof...(args);
    (std::cout

  • @ds9410
    @ds9410 4 роки тому +1

    На 19 слайде перегружаемый оператор должен быть friend?

    • @tilir
      @tilir  4 роки тому +1

      Да, спасибо, опечатка

    • @ds9410
      @ds9410 4 роки тому +1

      @@tilir Вам спасибо за Вашу работу.

  • @ruslanyunusov8499
    @ruslanyunusov8499 3 роки тому

    к 19 слайду
    template void print_bad(Args&&... args) {
    ((std::cout