Evet, tür olmayan bir parametredir. Birkaç çeşit şablon parametreniz olabilir
- Tür Parametreleri.
- Türleri
- Şablonlar (yalnızca sınıflar ve takma ad şablonları, işlevler veya değişken şablonlar yok)
- Tip Dışı Parametreler
- İşaretçiler
- Referanslar
- İntegral sabit ifadeler
Sahip olduklarınız son türden. Bu bir derleme zaman sabitidir (sabit ifade olarak adlandırılır) ve tamsayı veya numaralandırma türündedir. Standartta aradıktan sonra, sınıf şablonlarını türler bölümüne taşımak zorunda kaldım - şablonlar tür olmasa da. Ancak yine de bu türleri açıklamak amacıyla bunlara tip parametreleri denir. İşaretçileriniz (ve ayrıca üye işaretçileriniz) ve harici bağlantıya sahip nesnelere / işlevlere (diğer nesne dosyalarından bağlanabilenler ve tüm programda adresi benzersiz olanlar) referanslara sahip olabilirsiniz. Örnekler:
Şablon türü parametresi:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Şablon tamsayı parametresi:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
Şablon işaretçi parametresi (bir işleve bir işaretçi iletme)
template<void (*F)()>
struct FunctionWrapper {
static void call_it() { F(); }
};
// pass address of function do_it as argument.
void do_it() { }
FunctionWrapper<&do_it> test;
Şablon referans parametresi (bir tamsayı geçirme)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
Şablon şablon parametresi.
template<template<typename T> class AllocatePolicy>
struct Pool {
void allocate(size_t n) {
int *p = AllocatePolicy<int>::allocate(n);
}
};
// pass the template "allocator" as argument.
template<typename T>
struct allocator { static T * allocate(size_t n) { return 0; } };
Pool<allocator> test;
Parametre içermeyen bir şablon mümkün değildir. Ancak açık bir argüman içermeyen bir şablon mümkündür - varsayılan argümanları vardır:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
Sözdizimsel olarak, template<>
parametresiz bir şablon yerine açık bir şablon uzmanlığını işaretlemek için ayrılmıştır:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
static constexpr int
yerine type da kullanabilirsinizenum
. ÖyleyseFactorial<0>
şablon olabilirstatic constexpr int value = 1
vetemplate <int N> struct Factorial
olabilirstatic constexpr int value = N * Factorial<N - 1>::value;