Úvod
Na tomto serveru se nachází o C++ relativně dost článků. Bohužel se zabývají převážně úvodem do úplných základů a "pokročilejší" informace zde chybí. Proto jsem se rozhodl sepsat tento krátký článek, který Vám představí i něco méně známého.
Pokud již šablony znáte nebo používáte, nic nového se pravděpodobně nedozvíte.
Co to je?
Jak jistě víte, C++ je silně typový jazyk. To znamená, že typ musí být předem definován u parametrů (argumentů) funkcí, atributů tříd atp. Díky šablonám není v některých případech nutné typ definovat ihned.
K čemu to je?
Vynechání přesného typu vede k vyšší variabilitě kódu. Řekněme, že máte tři třídy: A, B, C (které nemají společného předka - thx to Bystroushaak). Každá z těcho tříd obsahuje metodu "foo". Pokud budete potřebovat funkci, které předáte objekt patřičného typu (A, B nebo C) a ona zavolá metodu "foo", budete bez použití šablon muset napsat tři funkce, přičemž všechny se budou lišit pouze datovým typem, se kterým pracují.
Šablony tedy umožňují vyšší míru abstrakce, tzn. zaměřit se při psaní kódu více na samotný algoritmus, než na datový typ, se kterým pracuje.
Příklady použití
Šablony se používají například při programování datových kontejnerů. Třída pro správu pole čísel (int) a správu řetězců (std::string) bude úplně stejná - lišit se bude pouze datovými typy vnitřních atributů a argumentů jednotlivých metod.
Standard C++ obsahuje knihovnu STL, jejíž název pochází od slov Standard Template Library. Obsahuje například datový kontejner std::vector<>, který umožňuje vytvářet a spravovat pole libovolných datových typů bez nutnosti jakkoliv se starat o alokaci a dealokaci paměti nebo pracovat s pointery.
Syntaxe
Šablona funkce
template <class T> T fn1(T param) {
// kód, který může pracovat s proměnnou param typu T
}
template <class T1, class T2> T fn2(T1 param1, T2 param2) {
// kód, který může pracovat s proměnnými param1, param2 typu T1, T2
}
fn1<int>(2);
fn2<int, float>(3, 4.2);
Šablona třídy
template <class T> class Foo {
public:
T f1(T a, T b);
void f2(T a);
private:
T atr1;
int atr2;
};
Foo<int> obj;
obj.f2(5);
Ukázkový kód
Ukázkový kód si můžete prohlédnout zde (snad bude alespoň jeden z odkazů funkční). Fakt sorry, ale sem to dávat nebudu, protože editor článků na SOOMu je naprosto dementní.
http://codepad.org/WruGLvD9
http://pastebin.com/8XNExgYv
http://paste2.org/p/1772545
http://pastebin.ca/2093908
Závěr
Pokud jste šablony dosud neznali a díky článku jste zhruba pochopili o co jde, pak splnil svůj účel. Jedná se o mnohem širší problematiku, ale cílem tohoto článku bylo pouze na ni upozornit a přinést úplně základní informace. Zbylé informace si již můžete dohledat sami dle potřeby.
Informace o pokročilém použití šablon lze čerpat například z knihy Moderní programování v C++ (anglický název je Modern C++ design).
Doporučené odkazy
http://cplusplus.com/reference/stl/
http://www.builder.cz/art/cpp/sablfci.html
http://www.builder.cz/art/cpp/sablcpp.html
http://cs.wikipedia.org/wiki/C%2B%2B#.C5.A0ablony