Saat mendeklarasikan template, saya terbiasa memiliki kode semacam ini:
template <class T>
Namun dalam pertanyaan ini , mereka menggunakan:
template <unsigned int N>
Saya memeriksa bahwa itu terkompilasi. Tapi apa artinya? Apakah ini parameter non-tipe? Dan jika demikian, bagaimana kita bisa memiliki template tanpa parameter tipe?
static constexpr int
bukan Andaenum
. JadiFactorial<0>
templatnya akan memilikistatic constexpr int value = 1
, dantemplate <int N> struct Factorial
dapat memilikistatic constexpr int value = N * Factorial<N - 1>::value;
constexpr
.Ya, ini adalah parameter non-tipe. Anda dapat memiliki beberapa jenis parameter template
Apa yang Anda miliki di sana adalah jenis yang terakhir. Ini adalah konstanta waktu kompilasi (disebut ekspresi konstan) dan berjenis integer atau enumerasi. Setelah mencarinya di standar, saya harus memindahkan templat kelas ke bagian tipe - meskipun templat bukan tipe. Tetapi mereka disebut tipe-parameter untuk tujuan mendeskripsikan jenis-jenis itu. Anda dapat memiliki pointer (dan juga pointer anggota) dan referensi ke objek / fungsi yang memiliki hubungan eksternal (yang dapat ditautkan dari file objek lain dan yang alamatnya unik di seluruh program). Contoh:
Parameter jenis template:
Parameter bilangan bulat template:
Parameter penunjuk template (meneruskan penunjuk ke suatu fungsi)
Parameter referensi template (meneruskan integer)
Parameter template template.
Template tanpa parameter apa pun tidak dimungkinkan. Tetapi templat tanpa argumen eksplisit apa pun dimungkinkan - itu memiliki argumen default:
Secara sintaksis,
template<>
dicadangkan untuk menandai spesialisasi template eksplisit, bukan template tanpa parameter:sumber
SillyExample
tidak dapat dikompilasi oleh GCC 4.8.4. Kesalahan pertama adalahthe value of ‘flag’ is not usable in a constant expression
. Ada kesalahan lain jugaAnda membuat template kelas Anda berdasarkan 'unsigned int'.
Contoh:
sumber
Kelas template seperti makro, hanya saja tidak terlalu jahat.
Pikirkan templat sebagai makro. Parameter pada template diganti menjadi definisi kelas (atau fungsi), saat Anda mendefinisikan kelas (atau fungsi) menggunakan template.
Perbedaannya adalah bahwa parameter memiliki "jenis" dan nilai yang diteruskan diperiksa selama kompilasi, seperti parameter ke fungsi. Tipe yang valid adalah tipe C ++ reguler Anda, seperti int dan char. Saat Anda membuat instance kelas template, Anda meneruskan nilai dari tipe yang Anda tentukan, dan dalam salinan baru definisi kelas template, nilai ini diganti di mana pun nama parameter berada dalam definisi aslinya. Sama seperti makro.
Anda juga dapat menggunakan jenis "
class
" atau "typename
" untuk parameter (keduanya benar-benar sama). Dengan parameter dari salah satu jenis ini, Anda dapat meneruskan nama jenis alih-alih nilai. Sama seperti sebelumnya, di mana pun nama parameter berada di definisi kelas template, segera setelah Anda membuat instance baru, menjadi jenis apa pun yang Anda berikan. Ini adalah penggunaan paling umum untuk kelas template; Semua orang yang tahu tentang template C ++ tahu bagaimana melakukan ini.Pertimbangkan kode contoh kelas template ini:
Fungsinya sama dengan kode penggunaan makro ini:
Tentu saja, versi templatnya satu miliar kali lebih aman dan lebih fleksibel.
sumber