Мазмунга өтүү

Сабактын башталышы

Вариативдик шаблондор

Каалаган типтеги каалаган сандагы аргументти кабыл алган шаблондор

Негизги идея: вариативдик шаблон - бул параметр топтомун кабыл алган шаблон: бир аталыш астына бириктирилген нөл же андан көп шаблондук аргумент. Дал ушунун негизинде std::make_unique, vector::emplace_back, std::tuple жана типке коопсуз форматтоо курулган. Баары компилятор тарабынан инстанциялоо учурунда чечилет, ошондуктан вариативдик чакыруу ал жайылтылган кол менен жазылган функция канча турса, ошончо турат: varargs жок, аткаруу учурунда типти жоготуу жок, үймө жок.
Аягында сиз муну кыла аласыз:
  • шаблондук жана функциялык параметр топтомдорун жарыялап, алардын узундугун sizeof... аркылуу билүү,
  • топтомду ... оператору менен жайылтуу, анын ичинде үлгүнү жайылтуу,
  • топтомду рекурсия менен (баш / куйрук) иштетүү жана базалык учур качан керек экенин билүү,
  • топтомду бир туюнтмага C++17 fold-туюнтмалары менен чогултуу,
  • топтомду std::forward аркылуу идеалдуу өткөрүү.

1. Параметр топтомдору жана sizeof...

Эки түрдөгү топтом чогуу иштейт. Шаблондук параметр топтому typename (же типтик эмес, же шаблондук параметр) артынан ... менен жазылат; функциялык параметр топтому ошол топтомду функциянын катар параметрлеринин тиби катары колдонот.

template <typename... Ts>      // Ts - ШАБЛОНДУК параметр топтому (типтердин тизмеси)
void probe(Ts... args) {       // args - ФУНКЦИЯЛЫК параметр топтому (маанилердин тизмеси)
    static_assert(sizeof...(Ts) == sizeof...(args));   // эки узундук тең келет
}

Топтом - бул тип эмес жана маани эмес. Бул компиляция учурундагы тизме, аны менен так эки нерсе кыла аласыз: узундугун сурап билүү же жайылтуу. Узундугун sizeof... берет - бул толугу менен компиляция учурунда эсептелген std::size_t тибиндеги constexpr; ал элементтерди санайт, алардын өлчөмдөрүн кошпойт:

template <typename... Ts>
void howMany(Ts... args) {
    std::cout << "arity = " << sizeof...(args) << "\n";   // мисалы 3
}
howMany(1, 2.0, 'x');   // arity = 3 ; Ts = {int, double, char}

Бош топтом уруксат: howMany() компиляцияланат жана arity = 0 чыгарат. Дал ушул чектик учур - вариативдик коддогу каталардын көбүнүн булагы, ошондуктан аны башынан эле эсиңизде тутуңуз.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө