Mam taki kod
template <size_t N>
class A
{
template <size_t N>
someFunctions() {};
};
Teraz chcę utworzyć instancje klasy i wywołać w niej funkcje w pętli for dla zestawu wielu wartości, takich jak
// in main()
int main()
{
for (int i = 1; i <= 100; i++)
{
const int N = i; // dont know how to do this
A<N> a;
a.functionCalls();
}
}
Jak to zrobić? Mając nadzieję na metodę, aby to zrobić.
c++
for-loop
templates
compile-time-constant
template-classes
nachiappan venkatesh
źródło
źródło
N
musi byćconstexpr
która jeśli jest to zmienna pętla że nie jest to przypadekOdpowiedzi:
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ć:
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:
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
źródło
static_cast<void>
?f
zwraca typ, który przeciąża przecinektemplate for
. Nadużywanie takich konstrukcji językowych jest zawsze bardziej bolesneW
N
musi być stała podczas kompilacji, który jest w normalnymfor
pętli nie jest możliwe.Istnieje jednak wiele obejść. Na przykład, zainspirowany tym postem SO , możesz zrobić coś takiego: ( Zobacz prezentację na żywo )
Drukuje
1
do100
W c ++ 17 powyższe można sprowadzić do jednej
AGenerator
klasy szablonów (tzn. Można uniknąć specjalizacji), używającif constexpr
. ( Zobacz prezentację na żywo )Wyjście :
W przypadku podania zakresu iteracji można użyć następujących opcji. ( Zobacz prezentację na żywo )
Dane wyjściowe są takie same jak w powyższej wersji.
źródło
Z C ++ 20 możesz używać szablonów lambdas, więc możesz wypróbować coś w następujący sposób
Poniżej znajduje się pełny przykład kompilacji, w którym drukowane są wszystkie liczby od 0 do 99
źródło
Jednym ze sposobów, w jaki można to zrobić, jest meta-programowanie szablonów z czymś takim:
źródło
Po prostu kompletność - czy naprawdę jest wymagana, aby klasa lub funkcja była szablonowana, jeśli jedyne użycie funkcji ma być wywołane z pętli?
Jeśli tak, a nie chcesz pisać ręcznie, spójrz na boost.hana.
źródło