Чернигин Алексей рассказывает о метапрограммировании на примере Boost.Geometry.
- Предыстория
- Необходимые геометрические примитивы
- Необходимые геометрические алгоритмы
- Требования на библиотеку
- Существующие альтернативы
- А что, если мы разрабатываем не приложение, а библиотеку?
- Требования на библиотеку
- Суровая правда жизни, или как выглядит типичная интеграция со сторонней библиотекой
- Пример интеграции с GEOS
- Пример интеграции с GEOS
- Проблемы с производительностью
- можно ли по-другому?
- Нам нужна магия generic!
- Расстояние между двумя точками struct Point
- Добавляем шаблоны
- Надо сделать generic access
- Generic access
- Применим к GeoPoint namespace boost
- О метафункции
- Обобщаем размерность
- Эволюция функции distance namespace boost::geometry
- Рекурсивное инстанцирование
- Промежуточные результаты
- Концепция Point
- Адаптация GeoPoint для концепции точки namespace boost::geometry::traits
- Концепция LineString
- Адаптация Polyline namespace boost
- Что в итоге
- Добавляем геометрические примитивы
- Есть 2 решения
- Концепция Point (финальная)
- Адаптация концепции точки
- Tag dispatching
- Возможности tag dispatching by type
- Добавляем геометрические примитивы
- Определим тип точки для геометрий
- Переопределим dimension
- Переопределим систему координат
- Реверсивный порядок аргументов
- Изменяем distance namespace boost::geometry::dispatch
- Результаты