Библиотека Boost - классификация часть 3

Заканчивая тему общей классификации, перед тем как перейти к собственно описанию библиотек, хотелось бы дать краткое описание каждой группы. Еще пришла в голову мысль о том, что неплохо бы библиотеки классифицировать по уровню сложности; начинать всегда лучше с простого и постепенно переходить к сложному.
Итак, пробуем.

Библиотека Boost - классификация часть 2

Итак, классификация библиотек Boost.
(деление не окончательное и еще будет изменяться по ходу разбора)

Библиотека Boost - классификация

Boost - одна из самых больших, функциональных и интересных библиотек для C++. Чего в ней только нет... На официальном сайте boost.org в документации существует классификация библиотек, входящих в состав Boost.
Мало кто применяет все это изобилие на практике. Некоторые библиотеки очень простые, а некоторые настолько сложны, что для правильной работы с ними нужно быть экспертом в C++. Некоторые чрезвычайно полезны, другие скорее демонстрируют потенциальные возможности языка, но вряд ли пригодятся вам в повседневной работе.

Официальное деление библиотек на группы показалось мне недостаточно точным, поэтому я решил сделать свое собственное деление.

Вот моя классификация:

Дальнейшие планы

В планах перенос в этот блог из личного архива и написание новых статей, посвященных темам. Итак, грандиозные планы по возобновлению блога:

  • языки программирования (возможно переводы глав из книг с собственными комментариями)
  • библиотека Boost (возможно переводы документации и комментарии)
  • Развитие C++
  • NoSQL СУБД (также возможны переводы)
  • разработка собственного языка программирования
  • интернет, социальные сети, пиринговые сети
  • софт
  • прочие идеи из самых разных областей

Как сделать структурную типизацию

Один из вариантов реализации структурной типизации.
Структурная типизация - это возможность использовать любой тип данных, который удовлетворяет некоторым требованиям "структурного интерфейса", без каких-либо явных указаний того, что данный тип реализует данный интерфейс.

Простейший пример: если есть некий тип данных POINT { float x, y; }, и есть некий тип MyPoint { float x, y; } то благодаря структурной типизации тип MyPoint можно применять там же, где и POINT (и наоборот). Более того, если объявлен некоторый тип MySuperPoint { int i, j; float z; char str[10]; float z, k, y; } то его тоже можно применять вместо POINT и MyPoint. Для структурной типизации достаточно совпадения имен внутренних имен и совместимости типов.

Еще немного о шаблонах

Небольшое дополнение.
Первое - решено отказаться от угловых скобок, и вместо них использовать обычные круглые со спецсимволом #. Угловые скобки приносят больше проблем, чем пользы. В языке D от угловых скобок отказались, в Scala отказались (там в пользу квадратных) и правильно сделали. В том же Си макросы используют обычные круглые скобки (даже без спецсимволов) и ничего.
Использование простых круглых скобок для шаблонов не есть хорошо с точки зрения понимания кода (смешиваются понятия вызова функции и макроподстановки). Вместо этого предлашается использовать скобки с символом #. То есть шаблон будет выглядеть так:

MyTempl#(x,y)

Таким образом, макрос - это идентификатор, начинающийся с решетки (мы как-бы имеем в виду что сам по себе макрос - код, относящийся к метауровню), а шаблон -  идентификатор , аргументы которого начинаются с решетки. В общем вполне логично.

Шаблоны без аргументов все равно должны иметь скобки (также как и функции). Синтаксис типа "MyTempl#" (то есть шаблон с решеткой на конце) скорее всего недопустим, так как можно спутать с макросом.

Метапрограммирование 5 - сводим все воедино

Итак, в предыдущих статьях мы получили, что в общем случае шаблоны - это чистые квазицитаты; что любые аргументы шаблонов и макросов - это фрагменты AST (объекты типа expr). Поскольку в квазицитаты можно в общем случае подставлять любые фрагменты AST, а не только имена типов и числовые константы (как в С++), то совершенно логично, что шаблоны можно расширить и обобщить. Мы выяснили,  что практически аналогично шаблоны могут получать в качестве аргументов нечисловые константы и функции. Также было сделано предположение, что аргументами шаблонов могут быть и произвольные блоки кода. Кроме того, сами блоки кода могут быть параметризированы подобно шаблонам. Именно этим мы и займемся.