Saya punya kode seperti
template <size_t N>
class A
{
template <size_t N>
someFunctions() {};
};
Sekarang saya ingin membuat instance kelas dan memanggil fungsi-fungsi di dalamnya dalam for loop untuk sekumpulan banyak nilai seperti
// 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();
}
}
Bagaimana cara melakukannya? Berharap ada metode untuk melakukan ini.
c++
for-loop
templates
compile-time-constant
template-classes
nachiappan venkatesh
sumber
sumber
N
diperlukanconstexpr
jika itu adalah variabel perulangan, bukan itu masalahnyaJawaban:
Ini akan membutuhkan sesuatu yang disebut
template for
yang merupakan bentuk yang diharapkan dari pernyataan ekspansi , yang merupakan sesuatu yang terlihat seperti for loop tetapi pada kenyataannya adalah blok templated dalam fungsi yang di-instanciated beberapa kali.Tentu saja, ada solusinya. Kami dapat menyalahgunakan lambdas generik untuk mendeklarasikan semacam blok templated lokal dan instansikan sendiri:
Fungsi ini membutuhkan urutan bilangan bulat dan instantiate lambda
F
sebanyak waktu sebagai panjang urutan.Digunakan seperti ini:
Di sini,
N
dapat dikirim sebagai parameter templat karena objek yang memiliki operator konversi constexpr ke tipe integer. Lebih tepatnya, inistd::integral_constant
dengan nilai yang meningkat.Contoh langsung
sumber
static_cast<void>
?f
mengembalikan jenis yang membebani operator komatemplate for
. Konstruksi bahasa yang menyalahgunakan seperti ini selalu lebih menyakitkanThe
N
kebutuhan untuk kompilasi-waktu konstan, yang dengan normalfor
lingkaran tidak mungkin.Tapi, ada banyak solusi. Misalnya, terinspirasi oleh pos SO ini , Anda dapat melakukan sesuatu seperti berikut ini. ( Lihat demo Langsung )
Mencetak
1
ke100
Dalam c ++ 17 , yang di atas dapat direduksi menjadi satu
AGenerator
kelas templat (mis. Spesialisasi dapat dihindari), menggunakanif constexpr
. ( Lihat demo Langsung )Keluaran :
Jika memberikan kisaran iterasi, Anda dapat menggunakan yang berikut ini. ( Lihat demo Langsung )
Outputnya sama dengan versi di atas.
sumber
Dari C ++ 20, Anda dapat menggunakan templat lambdas, sehingga Anda dapat mencoba sesuatu sebagai berikut
Berikut ini adalah contoh kompilasi lengkap yang mencetak semua angka dari 0 hingga 99
sumber
Salah satu cara Anda dapat melakukan ini adalah dengan meta-pemrograman template dengan sesuatu seperti ini:
sumber
Hanya untuk kelengkapan - apakah itu benar-benar diperlukan untuk kelas atau fungsi templated, jika satu-satunya penggunaan fungsi dipanggil dari loop?
Jika demikian dan Anda tidak ingin menulis dengan tangan, perhatikan boost.hana.
sumber