Библиотека knigago >> Компьютеры: Языки и системы программирования >> Другие языки и системы программирования >> Симуляция частичной специализации


СЛУЧАЙНЫЙ КОММЕНТАРИЙ

# 1743, книга: Двойник. Кукловоды (Романы)
автор: Роберт Энсон Хайнлайн

Роберт Хайнлайн, один из гигантов научной фантастики 20-го века, предлагает потрясающий дуэт романов в «Двойнике. Кукловоды». Эти истории исследуют интригующие темы дуальности, манипуляций и выживания в условиях морального выбора. В «Двойнике» Хайнлайн представляет сиамских близнецов, Чарли и Чарли Чана Линна, чьи разумы объединены. В то время как Чарли серьезный и добродушный, Чани одержимый властью и амбициозный. Когда Чани убеждает Чарли принять участие в опасном эксперименте, их...

Павел Кузнецов - Симуляция частичной специализации

Симуляция частичной специализации
Книга - Симуляция частичной специализации.  Павел Кузнецов  - прочитать полностью в библиотеке КнигаГо
Название:
Симуляция частичной специализации
Павел Кузнецов

Жанр:

Другие языки и системы программирования

Изадано в серии:

неизвестно

Издательство:

RSDN Group

Год издания:

-

ISBN:

неизвестно

Отзывы:

Комментировать

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

Краткое содержание книги "Симуляция частичной специализации"

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


Читаем онлайн "Симуляция частичной специализации". Главная страница.

Павел Кузнецов Симуляция частичной специализации

Введение

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

template‹class T, int Rows, int Columns›

class Matrix {

 //…

};

Предположим, в процессе разработки выяснилось, что производительность программы неудовлетворительна, и узким местом является функция умножения матриц с элементами типа float, и что эту проблему можно решить путем использования intrinsic-функций процессора. При наличии соответствующей поддержки компилятора это легко можно сделать при помощи так называемой частичной специализации шаблонов классов:

template‹int Rows, int Columns›

class Matrix‹float, Rows, Columns› {

 //…

};

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

Техника симуляции

Естественным первым шагом будет вынести различающуюся функциональность Matrix‹› в два базовых класса: Matrix_‹›, реализующий общий случай, и Matrix_float_‹› для специфики Matrix‹float,…›.

template‹class T, int Rows, int Columns›

class Matrix_ {

 //…

};


template‹int Rows, int Columns› class Matrix_float_ {

 //…

};

Таким образом, проблема сведется к тому, чтобы класс Matrix‹T, Rows, Columns› наследовался от Matrix_‹T, Rows, Columns› или Matrix_float_‹Rows, Columns›, в зависимости от того, является ли параметр T шаблона Matrix‹› типом float. Решение этой задачи и является главным «фокусом» данной техники.

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

template‹class T›

struct MatrixTraits {

 template‹int Rows, int Columns›

 struct Dimensions {

  typedef Matrix_‹T, Rows, Columns› Base;

 };

};


template‹›

struct MatrixTraits‹float› {

 template‹int Rows, int Columns›

 struct Dimensions {

  typedef Matrix_float_‹Rows, Columns› Base;

 };

};

Теперь осталось просто унаследовать Matrix‹› от соответствующего класса MatrixTraits‹›::…::Base.

template‹class T, int Rows, int Columns›

class Matrix: public MatrixTraits‹T›::template Dimensions‹Rows, Columns›::Base {

 //…

};

ПРИМЕЧАНИЕ Согласно текущей версии стандарта, использование ключевого слова template при квалификации вложенного шаблона Dimensions в данном случае обязательно, хотя некоторые компиляторы и позволяют его опускать.

Использование

Метапрограммирование и метафункции

Прежде чем перейти к изложению дальнейшего материала, полезно ввести понятия метапрограммирования и метафункции. Если внимательнее посмотреть на то, что происходит, когда компилятор встречает пример, подобный наследованию класса Matrix от MatrixTraits‹T›::…::Base, можно заметить, что фактически это является программированием компилятора. То есть, в данном случае компилятор как бы получает инструкцию: «если тип шаблона является типом float, то считать базовым классом Matrix_float_‹›, в противном случае – Matrix_‹›. Это можно рассматривать как программирование вычислений времени компиляции. Подобные техники иногда называют метапрограммированием шаблонами или просто метапрограммированием, а шаблоны, подобные MatrixTraits, – метафункциями.

Частичная специализация по виду аргумента шаблона

Одним из аспектов частичной специализации является возможность специализировать шаблон по виду аргумента, например, предоставить общую для всех указателей специализацию шаблона:

template‹class T›

class С {

 //…

};


template‹class T›

class С‹T*› {

 //…

};

Применительно к описанной технике, проблему можно свести к задаче создания метафункции, определяющей, является ли данный тип указателем:

template‹class T›

struct IsPointer {

 static const bool value =…;

};

где IsPointer‹T›::value принимает значения true или false в зависимости от того, является ли тип T указателем.

ПРИМЕЧАНИЕ Так как некоторые компиляторы не поддерживают должным образом определение статических констант времени компиляции в теле класса, эта метафункция может быть переписана эквивалентным образом с использованием enum.

--">

Оставить комментарий:


Ваш e-mail является приватным и не будет опубликован в комментарии.