5.2.15 · HinglishC++ Programming

Template specialization — full and partial

1,873 words9 min readRead in English

5.2.15 · Coding › C++ Programming


WHY specialization exist karti hai?


WHAT — teen cheezein jo distinguish karni hain?


HOW — har ek kaise likhein — first principles se

Step 1 — Primary template

template<class T>
struct TypeName {
    static const char* name() { return "generic"; }
};

Yeh step kyun? Yeh fallback hai. Jo bhi specialize nahi hua woh yahan aata hai.

Step 2 — Full specialization (SAARE params concrete)

template<>                    // empty <> = "koi free parameters nahi bache"
struct TypeName<int> {        // <int> = exact type jiske liye hum override kar rahe hain
    static const char* name() { return "int"; }
};

template<> kyun? Tumne har parameter fill kar diya, toh zero parameters bache — angle brackets empty hain. Naam ke baad <int> batata hai ki tum kaunsi instantiation replace kar rahe ho.

Step 3 — Partial specialization (KUCH params / ek shape)

template<class T>             // T abhi bhi free hai
struct TypeName<T*> {         // lekin humne SHAPE "T ki taraf pointer" match ki
    static const char* name() { return "pointer"; }
};
 
template<class A, class B>
struct TypeName<pair<A,B>> {  // koi bhi pair match karta hai, A aur B abhi bhi free hain
    static const char* name() { return "pair"; }
};

Yeh "partial" kyun hai? Tumne type ko ek concrete cheez par pin nahi kiya — tumne uski structure pin ki jabki T (ya A,B) open rakha. Toh yeh puri ek family cover karta hai.

Figure — Template specialization — full and partial

Selection rule (iska dil)


Worked Examples



Flashcards

FULL specialization kaunse keyword sequence se shuru hoti hai?
template<> (empty angle brackets — zero free parameters bache hain).
Full vs partial specialization ek-ek line mein?
Full = saare template params concrete types par fixed; partial = kuch params fixed YA shape constrained, params abhi bhi free hain.
Kya function templates ko PARTIALLY specialize kar sakte hain?
Nahi — sirf fully. Partial jaisa behaviour ke liye overloading use karo.
Type int* ke liye, kaun jeetta hai: primary T ya partial T*?
T* — yeh zyada specialized hai (T ke strict subset ko match karta hai).
Compiler specializations mein ambiguity kab report karta hai?
Jab do partial specializations match karein lekin koi bhi dusre se zyada specialized na ho.
Specialization first use ke relative kahan declare honi chahiye?
Type ki pehli instantiation se pehle, aur primary ke same namespace mein.
Kaunsa real STL feature partial specialization se bana hai?
Type traits jaise std::is_pointer, aur std::vector<bool> (full-ish container specialization).
std::vector<bool> std::vector<int> se alag kyun hai?
Yeh ek specialization hai jo booleans ko bit-pack karti hai space bachane ke liye, isliye yeh real bool objects store nahi karta.
Specializations ki "partial ordering" kya hai?
Woh rule jo kehta hai spec A, B se zyada specialized hai agar A se match karne wali har type B se bhi match kare lekin ulta nahi.
Kya ek partial specialization ek NAYA default template argument add kar sakti hai?
Nahi — default template arguments sirf primary template par hote hain.

Recall Feynman: 12-saal ke bachche ko explain karo

Socho ek vending machine jo koi bhi filling maango uske liye sandwich banati hai — woh hai generic template. Lekin peanut butter ke liye, tumhare paas ek secret special recipe hai (jelly bhi dalo!) — woh hai full specialization: sirf us exact filling ke liye trigger hoti hai. Ab maano kisi bhi tin can mein aane wali cheez ke liye tum pehle use kholna chahte ho — woh hai partial specialization: ise koi farq nahi padta can mein kya hai, bas yeh "can-shaped" honi chahiye. Jab tum button dabate ho, machine check karti hai: koi exact special recipe hai? Use karo. Warna, koi "shape" recipe fit hoti hai? Sabse specific wali use karo. Warna, boring generic recipe use karo.


Connections

  • Templates — function and class basics
  • Type Traits and std::is_pointer
  • SFINAE and enable_if
  • Overload Resolution vs Specialization
  • std::vector<bool> special case
  • Tag Dispatch and Policy-based Design
  • constexpr if (C++17) — alternative to specialization

Concept Map

kuch types ke liye fail hoti hai

motivate karta hai

same naam impl swap

hai woh

fallback hai

SAARE params fix karo

KUCH ya shape fix karo

likha jaata hai

free params rakhta hai

shapes match karta hai jaise

sirf yahi allowed hai

functions par forbidden use karo

Generic template recipe

Galat slow ya impossible

Specialization

Caller ko kabhi pata nahi chalta

Primary template

Unspecialized types ke liye

Full specialization

Partial specialization

template empty brackets

template with remaining T

T-pointer ya pair A B

Function templates ke liye

Overloading instead