Вариативдик шаблондор
Каалаган типтеги каалаган сандагы аргументти кабыл алган шаблондор
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 чыгарат. Дал ушул чектик учур - вариативдик коддогу каталардын көбүнүн булагы, ошондуктан аны башынан эле эсиңизде тутуңуз.