Bu yapı nedir: şablon <int> void funcName (int i)?

Oct 02 2020

Yanlışlıkla bir şablon işlevi uzmanlaşmasını kodlarken hata yaptım ve ortaya çıkan yapı VS17 ile derlemeyi geçti. (Aşağıdaki koddaki üçüncü yapı)

Bu geçerli bir yapı mı? Bu işlevi nasıl adlandırırım?

template <class T> void tempfunc(T t)
{
    cout << "Generic Template Version\n";
}

template <>
void tempfunc<int>(int i) {
    cout << "Template Specialization Version\n";
}

template <int> void tempfunc(int i)
{
    cout << "Coding Mistake Version\n";
}

Üçüncü yapıyı arayamadım.

Yanıtlar

6 cigien Oct 02 2020 at 02:15

Evet, bu geçerli bir yapı. Bu, türdeki tür olmayan bir şablon parametresine dayanan bir şablon aşırı yüklemesidir int.

Şöyle diyebilirsiniz:

tempfunc<42>(42);

Şablon sözdizimi olmayan çağrıların, bir tür parametresinde şablonlanmış sürümleri çağırmaya devam edeceğini unutmayın:

tempfunc(42);   // calls specialization
tempfunc(true); // calls primary 

İşte bir demo

3 RSahu Oct 02 2020 at 02:15

template parametreler iki türdendir - tür parametreler ve tür olmayan parametreler.

Kullandığınızda

template <class T> void tempfunc(T t) { ... }

templateParametre bir tür parametresidir. Böyle bir şablonu kullanmak için, türün çıkarsanması veya açıkça belirtilmesi gerekir.

Kullandığınızda

template <int> void tempfunc(int i) { ... }

templateparametresi olmayan bir tipi bir parametredir. Bildiğim kadarıyla, tür olmayan bir parametrenin değeri çıkarılamaz. Açıkça sağlanmalıdır.

Sonuncusu template, tip olmayan bir parametre kullanır. Çağrılabileceği değerin tipinde olması gerekir int. Örnek çağrılar:

tempfunc<0>(20);
tempfunc<999>(34);