<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nerzhul</id>
		<title>SEWiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nerzhul"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Nerzhul"/>
		<updated>2026-04-08T12:38:57Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=600</id>
		<title>Участник:Nerzhul</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=600"/>
				<updated>2011-10-19T21:48:10Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:ArtemB.jpg | 300px]]&lt;br /&gt;
&lt;br /&gt;
skype: nerzhul500&lt;br /&gt;
&lt;br /&gt;
email: nerzhulart(at)gmail.com&lt;br /&gt;
&lt;br /&gt;
Место учебы:&lt;br /&gt;
2006 - 2010 - Астраханский государственный университет, кафедра прикладной математики и информатики&lt;br /&gt;
2010 - now - Академический университет, Software Engineering&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ArtemB.jpg&amp;diff=599</id>
		<title>Файл:ArtemB.jpg</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:ArtemB.jpg&amp;diff=599"/>
				<updated>2011-10-19T21:45:10Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=598</id>
		<title>Участник:Nerzhul</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=598"/>
				<updated>2011-10-19T21:44:15Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:ArtemB.jpg]]&lt;br /&gt;
&lt;br /&gt;
skype: nerzhul500&lt;br /&gt;
&lt;br /&gt;
email: nerzhulart(at)gmail.com&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=597</id>
		<title>Участник:Nerzhul</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=597"/>
				<updated>2011-10-19T21:40:02Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;skype: nerzhul500&lt;br /&gt;
&lt;br /&gt;
email: nerzhulart(at)gmail.com&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=596</id>
		<title>Участник:Nerzhul</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nerzhul&amp;diff=596"/>
				<updated>2011-10-19T21:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: Новая страница: «skype: nerzhul500 email: nerzhulart(at)gmail.com»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;skype: nerzhul500&lt;br /&gt;
email: nerzhulart(at)gmail.com&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_C%2B%2B&amp;diff=347</id>
		<title>Метапрограммирование на C++</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%B0%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_C%2B%2B&amp;diff=347"/>
				<updated>2011-05-31T22:36:05Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: /* Проверка наличия метода у класса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Мы рассмотрим несколько &amp;lt;&amp;lt;необычных&amp;gt;&amp;gt; примеров использования шаблонов C++.&lt;br /&gt;
&lt;br /&gt;
== Статический &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; ==&lt;br /&gt;
В следующем примере приведен код, который компилируется только&lt;br /&gt;
на 64-разрядной платформе:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
char a[sizeof(int*) == 8 ? 1 : -1];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если код компилируется не на 64-разрядной платформе, то&lt;br /&gt;
&amp;lt;code&amp;gt;sizeof(int*) != 8&amp;lt;/code&amp;gt;, что приведет к объявлению массива a отрицательного&lt;br /&gt;
размера, а это запрещено стандартом.&lt;br /&gt;
&lt;br /&gt;
Эта идея используется в макросе &amp;lt;code&amp;gt;BOOST_STATIC_ASSERT&amp;lt;/code&amp;gt;, предоставляемом&lt;br /&gt;
модулем [http://www.boost.org/doc/libs/1_46_1/doc/html/boost_staticassert.html &amp;lt;code&amp;gt;Static Assert&amp;lt;/code&amp;gt;]&lt;br /&gt;
библиотеки Boost.&lt;br /&gt;
&lt;br /&gt;
== Tag passing ==&lt;br /&gt;
&lt;br /&gt;
Предположим, нам нужно написать функцию, которая циклически &lt;br /&gt;
переставляет элементы массива:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename It&amp;gt;&lt;br /&gt;
void rotate(It p, It, m, It q);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; --- итераторы, указывающие на начало и конец массива, &lt;br /&gt;
а элемент, на который указывает &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, после завершения работы функции будет располагаться&lt;br /&gt;
на месте элемента, на который указывает &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Допустим, у нас есть разные реализации этой функции для разных типов итераторов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename It&amp;gt;&lt;br /&gt;
void rotate_bidirectional(It p, It, m, It q);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename It&amp;gt;&lt;br /&gt;
void rotate_random_access(It p, It, m, It q);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы можем добавить к сигнатуре этих функций формальный параметр и перенести&lt;br /&gt;
информацию о типе итератора, с которым работает эта функция, из ее имени в этот&lt;br /&gt;
параметр:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename It&amp;gt;&lt;br /&gt;
void rotate(It p, It, m, It q, bidirectional_tag);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename It&amp;gt;&lt;br /&gt;
void rotate(It p, It, m, It q, random_access_tag);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда исходную функцию можно реализовать так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename It&amp;gt;&lt;br /&gt;
void rotate(It p, It, m, It q) {&lt;br /&gt;
  rotate(p, m, q, iterator_traits&amp;lt;It&amp;gt;::iterator_category());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Замена числовых идентификаторов на типы ==&lt;br /&gt;
&lt;br /&gt;
С помощью следующего трюка можно переписать функцию, поведение которой &lt;br /&gt;
зависит от числового идентификатора, так, чтобы ее поведение зависело от&lt;br /&gt;
формального параметра (как в предыдущем разделе):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void foo(int);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы можем определить шаблонную структуру:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;int i&amp;gt;&lt;br /&gt;
struct int2type { static const int value = i; };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь функцию foo можно переписать так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;int i&amp;gt;&lt;br /&gt;
void foo(int2type&amp;lt;i&amp;gt;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Substitution Failure Is Not An Error (SFINAE) ==&lt;br /&gt;
При создании экземпляров шаблонных функций могут возникать компиляции.&lt;br /&gt;
Рассмотрим следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int diff(int a, int b) {&lt;br /&gt;
  return a - b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
typename T::diff_type diff(T a, T b) {&lt;br /&gt;
  return a - b;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При вызове &amp;lt;code&amp;gt;diff(3, 4)&amp;lt;/code&amp;gt; компилятор попытается создать экземпляр&lt;br /&gt;
функции &amp;lt;code&amp;gt;diff&amp;lt;int&amp;gt;(int, int)&amp;lt;/code&amp;gt;, но это приведет к ошибке компиляции,&lt;br /&gt;
поскольку &amp;lt;code&amp;gt;int::diff_type&amp;lt;/code&amp;gt; не определено. Но эта ошибка не приводит &lt;br /&gt;
к выдаче сообщения об ошибке и прекращению компиляции, поскольку есть нешаблонная&lt;br /&gt;
функция c подходящей сигнатурой.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
С помощью SFINAE можно управлять разрешением перегруженных шаблонных функций.&lt;br /&gt;
В библиотеке Boost есть шаблонный тип [http://www.boost.org/doc/libs/1_46_1/libs/utility/enable_if.html &amp;lt;code&amp;gt;enable_if_c&amp;lt;/code&amp;gt;], &lt;br /&gt;
который позволяет решить эту задачу. Он определен следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;bool B, class T = void&amp;gt;&lt;br /&gt;
struct enable_if_c {&lt;br /&gt;
  typedef T type;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
struct enable_if_c&amp;lt;false, T&amp;gt; {};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class Cond, class T = void&amp;gt;&lt;br /&gt;
struct enable_if : public enable_if_c&amp;lt;Cond::value, T&amp;gt; {};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, конструкция &amp;lt;code&amp;gt;enable_if_c&amp;lt;false, T&amp;gt;::type&amp;lt;/code&amp;gt; вызовет ошибку компиляции.&lt;br /&gt;
&amp;lt;code&amp;gt;enable_if&amp;lt;/code&amp;gt; ведет себя так же, как и &amp;lt;code&amp;gt;enable_if_c&amp;lt;/code&amp;gt;, но более удобен при&lt;br /&gt;
использовании trait'ов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;class T, class Enable = void&amp;gt; &lt;br /&gt;
class A { ... };&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class A&amp;lt;T, typename enable_if&amp;lt;is_integral&amp;lt;T&amp;gt; &amp;gt;::type&amp;gt; { ... };&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class A&amp;lt;T, typename enable_if&amp;lt;is_float&amp;lt;T&amp;gt; &amp;gt;::type&amp;gt; { ... };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом примере &amp;lt;code&amp;gt;enable_if&amp;lt;/code&amp;gt; позволяет выбирать конкретную специализацию &lt;br /&gt;
шаблона класса &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; в зависимости от того, является ли тип &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;&lt;br /&gt;
целочисленным или вещественнозначным.&lt;br /&gt;
&lt;br /&gt;
== Проверка наличия метода у класса ==&lt;br /&gt;
&lt;br /&gt;
В следующем примере показано, как с помощью шаблонов можно проверить &lt;br /&gt;
наличие метода &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; у класса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef char true_type;&lt;br /&gt;
class false_type { true_type a[2]; };&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T, size_t (T::*)() const&amp;gt;&lt;br /&gt;
struct wrap { };&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
true_type check(T*, wrap&amp;lt;T, &amp;amp;T::size&amp;gt; = wrap&amp;lt;T, &amp;amp;T::size&amp;gt;()) { }&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
false_type check(void*, ...) { }&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
struct check_size {&lt;br /&gt;
  static const bool value = sizeof(check&amp;lt;T&amp;gt;((T*)0)) == sizeof(true_type);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class bar {&lt;br /&gt;
  void no_size() { }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  if (check_size&amp;lt;std::vector&amp;lt;int&amp;gt; &amp;gt;::value == true) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Vector has a size field!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (check_size&amp;lt;bar&amp;gt;::value != true) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Bar doesn't have a size field!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При создании экземпляра класса &amp;lt;code&amp;gt;check_size&amp;lt;std::vector&amp;lt;int&amp;gt;&amp;lt;/code&amp;gt; создается&lt;br /&gt;
первый вариант функции &amp;lt;code&amp;gt;check_size&amp;lt;/code&amp;gt;, поскольку можно без проблем создать&lt;br /&gt;
экземпляр структуры &amp;lt;code&amp;gt;wrap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При создании экземпляра класса &amp;lt;code&amp;gt;check_size&amp;lt;bar&amp;gt;&amp;lt;/code&amp;gt; создается второй вариант &lt;br /&gt;
функции &amp;lt;code&amp;gt;check_size&amp;lt;/code&amp;gt;, поскольку создание экземпляра структуры &amp;lt;code&amp;gt;wrap&amp;lt;/code&amp;gt;&lt;br /&gt;
приводит к ошибке.&lt;br /&gt;
&lt;br /&gt;
== Списки типов ==&lt;br /&gt;
На шаблонах можно реализовать списки в функциональном стиле. Правда, такие списки&lt;br /&gt;
будут существовать только во время компиляции.&lt;br /&gt;
&lt;br /&gt;
Сначала реализуем общее описание списка:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct nil { };&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename F, typename S = nil&amp;gt;&lt;br /&gt;
struct cons {&lt;br /&gt;
  typedef F head;&lt;br /&gt;
  typedef S tail;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда список из трех элементов можно описать так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
typedef cons&amp;lt;A, cons&amp;lt;B, cons&amp;lt;C&amp;gt; &amp;gt; type_list;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно унаследовать класс от всех классов, входящих в список:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename L&amp;gt;&lt;br /&gt;
struct inherit : L::head, inherit&amp;lt;typename L::tail&amp;gt; { };&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;&amp;gt;&lt;br /&gt;
struct inherit&amp;lt;nil&amp;gt; { };&lt;br /&gt;
&lt;br /&gt;
struct D : inherit&amp;lt;type_list&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Структура &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; будет унаследована от структур &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, &lt;br /&gt;
&amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Задача''' Найти способ вызвать общую функцию у всех родителей.&lt;br /&gt;
&lt;br /&gt;
'''Задача''' Реализовать красно-черные деревья на шаблонах :).&lt;br /&gt;
&lt;br /&gt;
== Поддержка метапрограммирования в Boost ==&lt;br /&gt;
&lt;br /&gt;
Вот список модулей библиотеки Boost, реализующих некоторые фичи (sic!) &lt;br /&gt;
метапрограммирования:&lt;br /&gt;
&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/utility/call_traits.htm call_traits],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/concept_check/concept_check.htm concept check],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/utility/enable_if.html enable_if],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/function_types/doc/html/index.html function_types],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/utility/in_place_factories.html in_place_factory, typed_in_place_factory],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/utility/operators.htm operators], &lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/property_map/doc/property_map.html property map],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/doc/html/boost_staticassert.html static_assert],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/type_traits/doc/html/index.html type_traits],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/fusion/doc/html/index.html fusion],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/index.html mpl],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/doc/html/proto.html proto].&lt;br /&gt;
&lt;br /&gt;
Модули Boost, реализующие некоторые концепции языков функционального программирования:&lt;br /&gt;
&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/bind/bind.html bind] и [http://www.boost.org/doc/libs/1_46_1/libs/bind/mem_fn.html mem_fn],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/doc/html/lambda.html lambda],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/doc/html/function.html function],&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/tuple/doc/tuple_users_guide.html tuple]&lt;br /&gt;
&lt;br /&gt;
Модули, входящие в состав модуля MPL:&lt;br /&gt;
&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/classes.html Метаконтейнеры] --- аналоги контейнеров STL, существующие только в момент компиляции &lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/concepts.html Метаитераторы] --- аналоги итераторов STL, работающие с метаконтейнерами: &lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/intrinsic-metafunctions.html Метафункции] и [http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/algorithms.html метаалгоритмы], работающие с метаконтейнерами.&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/introspection.html Статическая интроспекция], позволяющая определить наличие определения псевдонима типа внутри класса.&lt;br /&gt;
* [http://www.boost.org/doc/libs/1_46_1/libs/mpl/doc/refmanual/asserts.html Статический Assert] --- аналог &amp;lt;code&amp;gt;BOOST_STATIC_ASSERT&amp;lt;/code&amp;gt; с более подробным сообщением об ошибке (как заверяют разработчики).&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
&lt;br /&gt;
Вот простейший пример использования метаконтейнеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/mpl/vector.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/mpl/int.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;typeinfo&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace boost;&lt;br /&gt;
&lt;br /&gt;
typedef mpl::vector&amp;lt;int, mpl::int_&amp;lt;1&amp;gt;, double&amp;gt; numbers;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  std::cout &amp;lt;&amp;lt; mpl::v_at&amp;lt;numbers, 1&amp;gt;::type::value &amp;lt;&amp;lt; std::endl; // Выводит 1&lt;br /&gt;
  std::cout &amp;lt;&amp;lt; mpl::v_at&amp;lt;mpl::push_back&amp;lt;numbers, mpl::int_&amp;lt;2&amp;gt; &amp;gt;::type, 3&amp;gt;::type::value &amp;lt;&amp;lt; std::endl; // Выводит 2&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Осмысленный пример использования метаконтейнеров --- реализация концепции единиц измерения на С++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
  using namespace boost;&lt;br /&gt;
&lt;br /&gt;
  template&amp;lt;int kg, int m, int s&amp;gt;&lt;br /&gt;
  struct unit {&lt;br /&gt;
    typedef mpl::vector&amp;lt;mpl::int_&amp;lt;kg&amp;gt;, mpl::int_&amp;lt;m&amp;gt;, mpl::int_&amp;lt;s&amp;gt; &amp;gt; u;&lt;br /&gt;
&lt;br /&gt;
    float value;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  typedef unit&amp;lt;1, 0, 0&amp;gt; mass;&lt;br /&gt;
  typedef unit&amp;lt;0, 1, -1&amp;gt; velocity;&lt;br /&gt;
  typedef unit&amp;lt;0, 1, -2&amp;gt; acceleration;&lt;br /&gt;
  typedef unit&amp;lt;1, 1, -1&amp;gt; momentum;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Swoon2.gif]]&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=176</id>
		<title>Мероприятия</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=176"/>
				<updated>2011-04-11T19:11:01Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: /* Май 2011 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Апрель 2011 ==&lt;br /&gt;
* ADD 2011. Application Developer Days. http://www.addconf.ru/ (платно)&lt;br /&gt;
&lt;br /&gt;
== Май 2011 ==&lt;br /&gt;
* 13 Мая 2011, 10:00. CodeCamp 2011 — http://nevacamp.timepad.ru/event/4930 (бесплатно)&lt;br /&gt;
* 26-27 Мая 2011 Microsoft DevCon'11 — http://www.microsoft.com/ru-ru/events/devcon/ (платно)&lt;br /&gt;
* 9-11 Мая 2011 Fruct MeeGo 1/Ru http://fruct.org/meego1 (бесплатно)&lt;br /&gt;
* 13-14 Мая 2011 Конференция разработчиков компьютерных игр http://kriconf.ru/2011/ (платно)&lt;br /&gt;
Вот тут можно посмотреть большой список конференций:&lt;br /&gt;
http://it-event.ru/upcoming/&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=175</id>
		<title>Мероприятия</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=175"/>
				<updated>2011-04-11T17:12:03Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: /* Май 2011 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Апрель 2011 ==&lt;br /&gt;
* ADD 2011. Application Developer Days. http://www.addconf.ru/ (платно)&lt;br /&gt;
&lt;br /&gt;
== Май 2011 ==&lt;br /&gt;
* 13 Мая 2011, 10:00. CodeCamp 2011 — http://nevacamp.timepad.ru/event/4930 (бесплатно)&lt;br /&gt;
* 26-27 Мая 2011 Microsoft DevCon'11 — http://www.microsoft.com/ru-ru/events/devcon/ (платно)&lt;br /&gt;
* 9-11 Мая 2011 Fruct MeeGo 1/Ru http://fruct.org/meego1 (бесплатно)&lt;br /&gt;
&lt;br /&gt;
Вот тут можно посмотреть большой список конференций:&lt;br /&gt;
http://it-event.ru/upcoming/&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=174</id>
		<title>Мероприятия</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=174"/>
				<updated>2011-04-11T17:11:42Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: /* Май 2011 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Апрель 2011 ==&lt;br /&gt;
* ADD 2011. Application Developer Days. http://www.addconf.ru/ (платно)&lt;br /&gt;
&lt;br /&gt;
== Май 2011 ==&lt;br /&gt;
* 13 Мая 2011, 10:00. CodeCamp 2011 — http://nevacamp.timepad.ru/event/4930 (бесплатно)&lt;br /&gt;
* 26-27 Мая 2011 Microsoft DevCon'11 — http://www.microsoft.com/ru-ru/events/devcon/ (платно)&lt;br /&gt;
* 9-11 Мая 2011 Fruct MeeGo 1/Ru http://fruct.org/meego1&lt;br /&gt;
&lt;br /&gt;
Вот тут можно посмотреть большой список конференций:&lt;br /&gt;
http://it-event.ru/upcoming/&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=173</id>
		<title>Мероприятия</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%80%D0%BE%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D1%8F&amp;diff=173"/>
				<updated>2011-04-11T17:03:13Z</updated>
		
		<summary type="html">&lt;p&gt;Nerzhul: /* Май 2011 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Апрель 2011 ==&lt;br /&gt;
* ADD 2011. Application Developer Days. http://www.addconf.ru/ (платно)&lt;br /&gt;
&lt;br /&gt;
== Май 2011 ==&lt;br /&gt;
* 13 Мая 2011, 10:00. CodeCamp 2011 — http://nevacamp.timepad.ru/event/4930 (бесплатно)&lt;br /&gt;
* 26-27 Мая 2011 Microsoft DevCon'11 — http://www.microsoft.com/ru-ru/events/devcon/ (платно)&lt;/div&gt;</summary>
		<author><name>Nerzhul</name></author>	</entry>

	</feed>