<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1308833265888088018</id><updated>2011-07-07T13:15:28.904-07:00</updated><title type='text'>Програмування</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bachcode-ua.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bachcode-ua.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anatolii</name><uri>http://www.blogger.com/profile/11644284165407995644</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1308833265888088018.post-4174757604192196030</id><published>2011-03-15T14:12:00.000-07:00</published><updated>2011-03-23T13:23:04.135-07:00</updated><title type='text'>Функтори та функціональні адаптери STL</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Функтор&lt;/span&gt;ом називається об'єкт, для якого перевизначений оператор () дужки.&lt;p style="font-weight: bold;"&gt;Переваги:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Веде себе більш розумно, тому що має стан&lt;/li&gt;&lt;li&gt;Має певний тип і об'єкт можна передати функції шаблону&lt;/li&gt;&lt;li&gt;Зазвичай працює швидше вказівника на функцію.&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Предикат&lt;/span&gt; - функція, або об'єкт функції, що повертає логічне значення. Хоча не кожна функція, що повертає логічну величину є предикатом по правилам STL.&lt;br /&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Стандартні об'єкти функцій:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;negate&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;plus&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;minus&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;multiplies&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;divides&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;modulus&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;(not)equal_to&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;less&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;greater&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;logical_not/and/or&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Функціональний адаптер&lt;/span&gt; - об'єкт, що дозволяє комбінувати об'єкти функцій один з одним або з спеціальними функціями. Теж оголошуються в файлі functional.&lt;br /&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Стандартні функціональні адаптери:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;bind1st(op, value)&lt;/li&gt;&lt;li&gt;bind2nd(op, value)&lt;/li&gt;&lt;li&gt;not1(op)&lt;/li&gt;&lt;li&gt;not2(op)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Детальний опис алгоритмів можна знайти в книзі Nicolai M.Josuttis The C++ Standard, Chapter 8. STL Function Objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1308833265888088018-4174757604192196030?l=bachcode-ua.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bachcode-ua.blogspot.com/feeds/4174757604192196030/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://bachcode-ua.blogspot.com/2011/03/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/4174757604192196030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/4174757604192196030'/><link rel='alternate' type='text/html' href='http://bachcode-ua.blogspot.com/2011/03/blog-post.html' title='Функтори та функціональні адаптери STL'/><author><name>Anatolii</name><uri>http://www.blogger.com/profile/11644284165407995644</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1308833265888088018.post-4788289541533016897</id><published>2009-03-15T12:03:00.000-07:00</published><updated>2011-03-15T14:04:42.878-07:00</updated><title type='text'>Класифікація алгоритмів STL</title><content type='html'>&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Класифікація алгоритмів:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Cуфікс _if&lt;/em&gt; - використовується при наявності двох схожих форм алгоритму з однаковою кількітю параметрів. Версія без суфіксу використовується при передачі значення, аверсія з суфіксом _if при передачі функції, або об'єкту функції. Якщо ж версія алгоритму відрізняється додатковим параметром - вона зберігає за собою попереднє ім'я, тобто вживається без суфіксу.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Cуфікс _сopy&lt;/em&gt; означає, що алгоритм не тільки обробляє елементи, а й копіює їх в інтервал, який приймає. Наприклав reverse() переставляє елементи в зворотньому порядку, а reverse_sopy() копіює елементи в інтервал в зворотньому напрямку.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;Алгоритми поділяються на групи:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;не модифікуючі: &lt;/span&gt;&lt;span style="font-weight: normal;"&gt;for_each, count, max/min_element, search, find&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;модифікуючі:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; for_each, copy, merge, fill, replace&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;алгоритми видалення:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; remove, remove_if, remove_copy_if, unique&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;алгоритми перестановки:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; reverse, rotate, random_shuffle, partition, stable_partition&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;алгоритми сортування:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; sort, stable_sort, partial_sort, partition, stable_partition, make_heap, &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;push/pop_heap, &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;sort_heap&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;алгоритми впорядкованих інтервалів:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; binary_search, lower/upper_bound, equal_range, merge, set_difference&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;числові &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: bold;"&gt;алгоритми:&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; accumulate, inner_product, adjacent_difference, partial_sum&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Детальний опис алгоритмів можна знайти в книзі Nicolai M.Josuttis The C++ Standard, Chapter 9  Algorithms STL.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1308833265888088018-4788289541533016897?l=bachcode-ua.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bachcode-ua.blogspot.com/feeds/4788289541533016897/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://bachcode-ua.blogspot.com/2009/03/blog-post_15.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/4788289541533016897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/4788289541533016897'/><link rel='alternate' type='text/html' href='http://bachcode-ua.blogspot.com/2009/03/blog-post_15.html' title='Класифікація алгоритмів STL'/><author><name>Anatolii</name><uri>http://www.blogger.com/profile/11644284165407995644</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1308833265888088018.post-5598164174340047982</id><published>2009-03-03T13:18:00.000-08:00</published><updated>2009-03-03T13:35:03.609-08:00</updated><title type='text'>Оператори -&gt;*  ,  .*</title><content type='html'>Якось я захотів створити вказівник на функцію класу, і в залежності від певних обставин присвоювати йому вказівники на інші функції цього ж класу, для того, щоб при звернені до цього вказівника викликалась потрібна мені (залежно від обставин) функція. Звісно ж без знання цих операторів у мене нічого не вийшло. Дивно, що у багатьох авторитетних книжках по C++ про це не написано. Хочу звернути увагу, що -&gt;* це не два окремих оператори, а один, так само як і .* Стрілочка-зірочка та крапочка-зірочка - окремі визначені оператори C++.&lt;br /&gt;&lt;p&gt;Ось простенький приклад:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt iostream&amp;gt&lt;br /&gt;using namespace std;&lt;br /&gt;class MyClass&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    MyClass(){}&lt;br /&gt;    ~MyClass(){}&lt;br /&gt;&lt;br /&gt;    typedef void (MyClass:: *MY_FUNC_PTR)(int val);&lt;br /&gt;    // екземпляр вказівника на функцію класу&lt;br /&gt;    MY_FUNC_PTR stateFuncPtr;&lt;br /&gt;&lt;br /&gt;    void stateWaitFunc(int val)&lt;br /&gt;    {&lt;br /&gt;        cout &amp;lt &amp;lt val &amp;lt &amp;lt ". State WAITING function()" &amp;lt &amp;lt endl;&lt;br /&gt;    }&lt;br /&gt;    void stateDoFunc(int val)&lt;br /&gt;    {&lt;br /&gt;        cout &amp;lt &amp;lt val &amp;lt &amp;lt ". State DOING function()" &amp;lt &amp;lt endl;&lt;br /&gt;    }&lt;br /&gt;    void someFunk()&lt;br /&gt;    {&lt;br /&gt;        // присвоюємо вказівник на stateDoFunc функцію&lt;br /&gt;        stateFuncPtr = &amp;amp;MyClass::stateDoFunc;&lt;br /&gt;        // виклик функції stateDoFunc шляхом звертання до нашого вказівника&lt;br /&gt;        (this-&gt;*stateFuncPtr)(1);&lt;br /&gt;        // присвоюємо вказівник на stateWaitFunc функцію&lt;br /&gt;        stateFuncPtr = &amp;amp;MyClass::stateWaitFunc;&lt;br /&gt;        // виклик функції stateWaitFunc шляхом звертання до вказівника&lt;br /&gt;        (this-&gt;*stateFuncPtr)(2);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    MyClass m;&lt;br /&gt;    m.someFunk();&lt;br /&gt;    // присвоюємо вказівник на stateDoFunc функцію (зовні класу)&lt;br /&gt;    m.stateFuncPtr = &amp;amp;MyClass::stateDoFunc;&lt;br /&gt;    // виклик функції stateDoFunc шляхом звертання до вказівника&lt;br /&gt;    (m.*m.stateFuncPtr)(3);&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Матеріал взято з власного наступання на граблі.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1308833265888088018-5598164174340047982?l=bachcode-ua.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bachcode-ua.blogspot.com/feeds/5598164174340047982/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://bachcode-ua.blogspot.com/2009/03/blog-post_03.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/5598164174340047982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/5598164174340047982'/><link rel='alternate' type='text/html' href='http://bachcode-ua.blogspot.com/2009/03/blog-post_03.html' title='Оператори -&gt;*  ,  .*'/><author><name>Anatolii</name><uri>http://www.blogger.com/profile/11644284165407995644</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1308833265888088018.post-3092539598191945616</id><published>2009-03-03T11:29:00.000-08:00</published><updated>2009-03-03T12:20:32.417-08:00</updated><title type='text'>Узагальнення ітераторів</title><content type='html'>&lt;p&gt;Категорії ітераторів:&lt;/p&gt;&lt;em&gt;Категорія - Можливості - Підтримка&lt;/em&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Ітератор вводу&lt;/strong&gt; - читання в прямому напрямку - Потоковий Ітератор вводу.&lt;/p&gt;&lt;strong&gt;Ітератор виводу&lt;/strong&gt; - Запис в прямому напрямку - Потоковий Ітератор виводу, ітератор вставки.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Прямий ітератор&lt;/strong&gt;  - Читання і запис в прямому напрямку&lt;/p&gt;&lt;strong&gt;Двонаправлений ітератор&lt;/strong&gt; - Читання і запис в оберненому напрямках -list, map, mulimap, set, multiset.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Ітератордовільного доступу&lt;/strong&gt; - Читання і запис з довільним доступом - vector, deque, string, array &lt;/p&gt;&lt;p&gt;Ітераторні адаптери:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Обернені ітератори&lt;/strong&gt; - адаптери, що перевизначають оператори ++ та -- так щоб пошук виконувався в оберненому порядку.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ітератори вставки&lt;/strong&gt; - адаптер, що перетворює присвоєння нового значення у вставку нового значення. Бувають: &lt;em&gt;Кінцеві&lt;/em&gt; (додає нове значення в кінець контейнера викликом функції push_back()), &lt;em&gt;Початкові&lt;/em&gt; (вставляє нове значення в початок контейнера викликом функції push_front()), &lt;em&gt;Загальні&lt;/em&gt; (на основі функції insert()).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Потокові ітератори&lt;/strong&gt; - адаптер, що використовує поток в якості джерела або приймача алгоритму. &lt;em&gt;Потокові ітератопи виводу&lt;/em&gt; записують значення що присвоюється у вихідний потік даних. &lt;em&gt;Потокові ітератопи вводу&lt;/em&gt; читають елементи з вхідного потоку даних.&lt;/p&gt;&lt;p&gt;Цікавий приклад потокових ітераторів:&lt;/p&gt;&lt;p&gt;Програма читає слова із стандартного потоку вводу і виводить їх у відсортованому порядку виключаючи дублікати.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt iostream&amp;gt&lt;br /&gt;#include &amp;lt vector&amp;gt&lt;br /&gt;#include &amp;lt string&amp;gt&lt;br /&gt;#include &amp;lt algorithm&amp;gt&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    vector &amp;lt string&amp;gt coll;&lt;br /&gt;&lt;br /&gt;    // читання слів з вхідного потоку даних&lt;br /&gt;    copy (istream_iterator &amp;lt string&amp;gt (cin), // початок джерела&lt;br /&gt;        istream_iterator &amp;lt string&amp;gt (), // кінець джерела&lt;br /&gt;        back_inserter(coll));   // приймач&lt;br /&gt;&lt;br /&gt;    sort (coll.begin(), coll.end());&lt;br /&gt;&lt;br /&gt;    unique_copy(coll.begin(), coll.end(), // джерело&lt;br /&gt;        ostream_iterator &amp;lt string&amp;gt (cout, "\n"));// приймач&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Матеріал взято із книги Nicolai M.Josuttis The C++ Standard Library&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1308833265888088018-3092539598191945616?l=bachcode-ua.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bachcode-ua.blogspot.com/feeds/3092539598191945616/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://bachcode-ua.blogspot.com/2009/03/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/3092539598191945616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/3092539598191945616'/><link rel='alternate' type='text/html' href='http://bachcode-ua.blogspot.com/2009/03/blog-post.html' title='Узагальнення ітераторів'/><author><name>Anatolii</name><uri>http://www.blogger.com/profile/11644284165407995644</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1308833265888088018.post-1291850024412602928</id><published>2009-02-19T23:54:00.000-08:00</published><updated>2009-02-24T23:59:39.890-08:00</updated><title type='text'>Трошки про Шаблони</title><content type='html'>Шаблони - це  сімейство з однаковою поведінкою без конкретизації типу. При використанні шаблонів цей тип передається у вигляді аргументу або проміжно.&lt;br /&gt;Ось типовий приклад:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt typename T&amp;gt&lt;br /&gt;inline const T&amp; max(const T&amp; a, const T&amp; b)&lt;br /&gt;{&lt;br /&gt;    return a &amp;lt  b : b ? a;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Нетипізовані параметри шаблонів&lt;br /&gt;Нетипізований параметр вважається частиною визначення типу.&lt;br /&gt;Наприклад шаблон стандартного класу bitset &amp;lt &amp;gt отримує кількість бітів. Зверніть увагу, що ці бітові поля відносяться до різних типів і їх не можна присвоювати один одному:&lt;br /&gt;bitset &amp;lt 32&amp;gt flags32;&lt;br /&gt;bitset &amp;lt 50&amp;gt flags50;&lt;br /&gt;Параметри по замовчуванню&lt;br /&gt;Наступний фрагмент дозволяє оголосити об'єкти класу MyClass з одним, або двома параметрами:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt typename T, typename Container = vector&amp;lt T&amp;gt &amp;gt&lt;br /&gt;class MyClass;&lt;br /&gt;&lt;br /&gt;MyClass &amp;lt int&amp;gt myClass;&lt;br /&gt;MyClass &amp;lt int, vector&amp;lt int&amp;gt &amp;gt myClass2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ключове слово typename&lt;br /&gt;Слово означає, що наступний за ним ідентифікатор означає тип:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt class T&amp;gt&lt;br /&gt;class MyClass {&lt;br /&gt;    typename T::SubType* ptr;&lt;br /&gt;    ...&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В даному випадку слово typename означає, що SubType є підтипом класу T, відповідно ptr - показчик на тип T::SubType. Без typename ідентифікатор SubType інтерпритується як статичний член класу і рядок сприймається як операція множення значення SubType класу T на значення ptr; Але в даному випадку любий тип який буде підставлений шаблону повинен мати внутрішній тип SubType. SubType може бути як класом оголошеним в середині іншого, так і простом typedef-ом.&lt;br /&gt;&lt;br /&gt;Шаблонні функції класів&lt;br /&gt;Такі функції не можуть бути віртуальними і мати параметри по замовчуванню!&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MyClass {&lt;br /&gt;    ...&lt;br /&gt;    template &amp;lt class T&amp;gt&lt;br /&gt;    void f(T);&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Шаблон MyClass::f оголошує набір функцій з параметром довільного типу, при умові що цей тип підтримує всі операції, які використовуються в f();&lt;br /&gt;Дана можливість часто використовується для автоматичного приведення типів в класах шаблонів. Наприклад в наступному визначенні аргумент x функції assign() повинен точно відповідати типу об"єкта, для якого він викликається:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt class T&amp;gt&lt;br /&gt;class MyClass {&lt;br /&gt;private:&lt;br /&gt;    T value;&lt;br /&gt;public:&lt;br /&gt;    void assign(const MyClass&amp;lt T&amp;gt&amp; x) {&lt;br /&gt;        value = x.value; // тип x повинен відповідати типові *this&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Зверніть увагу, використання шаблону з іншим типом при виклику assign() являється помилкою навіть в тому випадку якщо між типами виконується автоматичне приведення:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void f()&lt;br /&gt;{&lt;br /&gt;    MyClass &amp;lt double&amp;gt b;&lt;br /&gt;    MyClass &amp;lt int&amp;gt i;&lt;br /&gt;    d.assign(b); // OK&lt;br /&gt;    d.assign(i); // Помилка: i відноситься до до типу MyClass &lt;br /&gt;                   // в даному випадку обов"язковим є MyClass &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Оголошення іншого шаблону у функції дозволяє обійти вимогу співпадіння типів:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt class T&amp;gt&lt;br /&gt;class MyClass {&lt;br /&gt;private:&lt;br /&gt;    T value;&lt;br /&gt;public:&lt;br /&gt;    template &amp;lt class X&amp;gt&lt;br /&gt;    void assign(const MyClass&amp;lt X&amp;gt&amp; x) {&lt;br /&gt;        value = x.getValue();&lt;br /&gt;    }&lt;br /&gt;    T getValue() const {&lt;br /&gt;        return value;&lt;br /&gt;    }&lt;br /&gt;...&lt;br /&gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;тепер функція f() є вірною.&lt;br /&gt;Оскільки тип аргументу x не є типом *this, нам довелося додати функцію getValue() для доступу до приватної змінної.&lt;br /&gt;&lt;br /&gt;Шаблонний конструктор використовуються для забезпечення неявних приведень типів при копіюванні об"єктів, але майте на увазі, шаблонний конструктор не заміняє стандартний конструктор копіювання. При точному співпадінні типів буде викликаний стандартний конструктор копіювання:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt class T&amp;gt&lt;br /&gt;class MyClass {&lt;br /&gt;public:&lt;br /&gt;    // Шаблонний конструктор з автоматичним приведенням тиу&lt;br /&gt;     template &amp;lt class X&amp;gt&lt;br /&gt;     MyClass(const MyClass&amp;lt X&amp;gt&amp; x);&lt;br /&gt;};&lt;br /&gt;void f()&lt;br /&gt;{&lt;br /&gt;    MyClass &amp;lt double&amp;gt xd;&lt;br /&gt;...&lt;br /&gt;     MyClass &amp;lt double&amp;gt xd2(xd); // Стандартний конструктор копії&lt;br /&gt;     MyClass &amp;lt int&amp;gt xi(xd);     // Шаблонний конструктор&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Явна ініціалізація базових типів була реалізована для того, щоб ви могли написати код шаблону в якому величині любого типу буде попередньо присвоєне значення по замовчуванню.&lt;br /&gt;Виклик конструктора гарантує, що для всіх базових типів змінна x буде ініціалізована нулем.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt class T&amp;gt&lt;br /&gt;void f()&lt;br /&gt;{&lt;br /&gt;    T x = T();&lt;br /&gt;    ...&lt;br /&gt;    int i = int(); // ініціалізація змінної i нулем&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Явна спеціалізація шаблонів.&lt;br /&gt;&lt;br /&gt;Хочу звернути увагу на одну особливість використання явної спеціалізації з компілятором майкрософт візуал студіо та компілятором gcc.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt iostream&amp;gt&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;class MyClass&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    MyClass() {}&lt;br /&gt;    ~MyClass() {}&lt;br /&gt;    enum State { NoneState = 0x0,&lt;br /&gt;                Edited = 0x1,&lt;br /&gt;                Inserted = 0x2,&lt;br /&gt;                Removed = 0x4,&lt;br /&gt;                Saved = 0x8 };&lt;br /&gt;    State m_state;&lt;br /&gt;    template &amp;lt State state&amp;gt void setState() { &lt;br /&gt;        cout &amp;lt &amp;lt  "Usual setState template!!!!" &amp;lt &amp;lt  endl; &lt;br /&gt;    }&lt;br /&gt;    /////////////  Explicid Specialization for State::Saved&lt;br /&gt;    template &amp;lt &amp;gt void setState&amp;lt Saved&amp;gt() { &lt;br /&gt;        cout &amp;lt &amp;lt  "Explicid Specialication for Saved!!!!" &amp;lt &amp;lt  endl; &lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    MyClass m;&lt;br /&gt;    m.setState&amp;lt MyClass::Removed&amp;gt();&lt;br /&gt;    m.setState&amp;lt MyClass::Saved&amp;gt();&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Зверніть увагу на рядок&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;template &amp;lt &amp;gt void setState&amp;lt Saved&amp;gt() { &lt;br /&gt;    cout &amp;lt &amp;lt  "Explicid Specialication for Saved!!!!" &amp;lt &amp;lt  endl; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Компілятор візуал студіо 2005 без будть яких проблем допускає оголошення явної спеціалізації в середині класу, а от gcc (у мому випадку версії 4.3.0) видає наступну помилку:&lt;br /&gt;error: explicit specialization in non-namespace scope ‘class MyClass’&lt;br /&gt;Тому краще оголосити явну спеціалізацію за межами класу, як це потрібно:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MyClass&lt;br /&gt;{...&lt;br /&gt;};&lt;br /&gt;/////////////  Explicid Specialization for State::Saved&lt;br /&gt;template &amp;lt &amp;gt void MyClass::setState&amp;lt MyClass::Saved&amp;gt() { &lt;br /&gt;    cout &amp;lt &amp;lt  "Explicid Specialication for Saved!!!!" &amp;lt &amp;lt  endl; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Матеріал взято із книги Nicolai M.Josuttis The C++ Standard Library&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1308833265888088018-1291850024412602928?l=bachcode-ua.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bachcode-ua.blogspot.com/feeds/1291850024412602928/comments/default' title='Дописати коментарі'/><link rel='replies' type='text/html' href='http://bachcode-ua.blogspot.com/2009/02/blog-post.html#comment-form' title='0 коментарі(в)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/1291850024412602928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1308833265888088018/posts/default/1291850024412602928'/><link rel='alternate' type='text/html' href='http://bachcode-ua.blogspot.com/2009/02/blog-post.html' title='Трошки про Шаблони'/><author><name>Anatolii</name><uri>http://www.blogger.com/profile/11644284165407995644</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
