Wymagałoby to czegoś, co nazywa się template for
oczekiwaną formą ekspansji , która wygląda jak pętla for, ale w rzeczywistości jest blokiem szablonowym w funkcji, która jest wielokrotnie instalowana.
Oczywiście istnieje obejście tego problemu. Możemy nadużywać ogólnych lambdów, aby zadeklarować jakiś lokalny blok szablonów i sami go wprowadzić:
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>{})), ...);
}
Ta funkcja przyjmuje sekwencję całkowitą i tworzy instancję lambda F
tyle razy, ile długość sekwencji.
Używa się go w następujący sposób:
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();
});
Tutaj N
można wysłać jako parametr szablonu, ponieważ jest to obiekt, który ma operator konwersji constexpr na typ całkowity. Mówiąc dokładniej, std::integral_constant
ma coraz większą wartość.
Przykład na żywo
N
musi byćconstexpr
która jeśli jest to zmienna pętla że nie jest to przypadek