Šablony v C++

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: independent
Datum: 12.11.2011
Hodnocení/Hlasovalo: 3/1

Krátký úvod do šablon v jazyce C++.

Ú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