Şablon kesinti kılavuzları, derleyiciye bir dizi yapıcı argümanını (ve türlerini) sınıf için şablon parametrelerine nasıl çevireceğini söyleyen bir şablon sınıfıyla ilişkili kalıplardır.
En basit örnek, std::vector
bir yineleyici çifti alan kurucusudur.
template<typename Iterator>
void func(Iterator first, Iterator last)
{
vector v(first, last);
}
Derleyici anlamaya ihtiyacı vector<T>
'in T
tip olacaktır. Cevabın ne olduğunu biliyoruz; T
olmalıdır typename std::iterator_traits<Iterator>::value_type
. Ama derleyiciye yazmak zorunda kalmadan nasıl söyleriz vector<typename std::iterator_traits<Iterator>::value_type>
?
Bir kesinti kılavuzu kullanıyorsunuz:
template<typename Iterator> vector(Iterator b, Iterator e) ->
vector<typename std::iterator_traits<Iterator>::value_type>;
Bu, derleyiciye, vector
bu modelle eşleşen bir kurucu çağırdığınızda vector
, sağdaki kodu kullanarak uzmanlığı çıkaracağını söyler .->
.
Türün argümanlardan çıkarılması, bu argümanlardan birinin türüne dayalı olmadığında kılavuzlara ihtiyacınız vardır. Bir ' vector
den a'yı başlatmak , initializer_list
açıkça vector
' s 'yi kullanırT
, bu nedenle bir rehbere ihtiyaç duymaz.
Sol tarafın mutlaka gerçek bir kurucu belirtmesi gerekmez. Çalışma şekli, bir tür üzerinde şablon yapıcı kesinti kullanırsanız, tüm kesinti kılavuzlarına göre ilettiğiniz argümanlarla eşleşmesidir (birincil şablonun gerçek oluşturucuları örtük kılavuzlar sağlar). Bir eşleşme varsa, türe hangi şablon bağımsız değişkenlerinin sağlanacağını belirlemek için bunu kullanır.
Ancak bu kesinti yapıldıktan sonra, derleyici tür için şablon parametrelerini anladığında, bu türdeki nesnenin başlatılması sanki hiçbiri olmamış gibi devam eder. Yani seçilen kesinti kılavuzunun kurucu ile eşleşmesi gerekmez .
Bu ayrıca, toplamalar ve toplu başlatma içeren kılavuzları kullanabileceğiniz anlamına gelir:
template<typename T>
struct Thingy
{
T t;
};
Thingy(const char *) -> Thingy<std::string>;
Thingy thing{"A String"};
Bu nedenle kesinti kılavuzları yalnızca başlatılan türü bulmak için kullanılır. Gerçek başlatma süreci, belirleme yapıldıktan sonra tam olarak daha önce olduğu gibi çalışır.