Для цього знадобиться щось, що називається a, template for
- це очікувані заяви про розширення форми , які є схожими на цикл for, але насправді це шаблонний блок у функції, яка інстанцірується кілька разів.
Звичайно, є рішення. Ми можемо зловживати загальними лямбдами, щоб оголосити якийсь локальний блок шаблонів та інстанціювати його самостійно:
template <typename T, T... S, typename F>
constexpr void for_sequence(std::integer_sequence<T, S...>, F f) {
(static_cast<void>(f(std::integral_constant<T, S>{})), ...);
}
Ця функція займає цілу послідовність і інстанціює лямбда F
стільки ж разів, скільки довжина послідовності.
Він використовується так:
for_sequence(std::make_index_sequence<100>(), [](auto N) { /* N is from 0 to 99 */
A<N + 1> a; /* N + 1 is from 1 to 100 */
a.functionCalls();
});
Тут N
може бути надіслано як параметр шаблону, оскільки це об'єкт, який має оператор перетворення constexpr для цілого типу. Точніше, це std::integral_constant
зі зростаючим значенням.
Живий приклад
N
потрібно бути,constexpr
який, якщо це