Специализация шаблонных функций – членов шаблонного класса
Специализация шаблонных функций – членов шаблонного класса
К сожалению, вышеприведенный код не будет компилироваться на компиляторах, не поддерживающих специализацию шаблонов-функций – членов шаблонов классов.
ПРИМЕЧАНИЕ К таким относятся, например, gcc-2.95 и gcc-2.96
Попробуем обойтись без них. Специализация в той или иной форме нам в любом случае понадобится, так что воспользуемся тем, что есть – частичной специализацией классов. Введем вспомогательный класс и специализируем его для особого случая обычных указателей.
template<class R, class T, class TT>
struct gen_mem_fun_operator {
R operator()(TT p, R (T::*pm)()) {return (p.operator->()->*pm)();}
};
template<class R, class T>
struct gen_mem_fun_operator<R, T, T*> {
R operator()(T* p, R (T::*pm)()) {return (p->*pm)();}
};
Тогда наш gen_mem_fun_t запишется так:
template<class R, class T>
struct gen_mem_fun_t {
explicit gen_mem_fun_t(R (T::*pm_)()): pm(pm_) {}
template<class TT> R operator()(TT p) {return gen_mem_fun_operator<R, T, TT>()(p, pm);}
private:
R (T::*pm)();
};
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Частичная специализация по виду аргумента шаблона
Частичная специализация по виду аргумента шаблона Одним из аспектов частичной специализации является возможность специализировать шаблон по виду аргумента, например, предоставить общую для всех указателей специализацию шаблона:template‹class T› class С { //…}; template‹class T› class
Частичная специализация
Частичная специализация К сожалению, не все компиляторы поддерживают частичную специализацию шаблонных классов.ПРИМЕЧАНИЕ К таким относится и Microsoft Visual C++ 6.0/7.0 Для решения этой проблемы можно использовать паттерн «traits», специфичный для C++. К сожалению, он не сможет
Правило 43: Необходимо знать, как обращаться к именам в шаблонных базовых классах
Правило 43: Необходимо знать, как обращаться к именам в шаблонных базовых классах Предположим, что нам нужно написать программу, которая будет посылать сообщения нескольким компаниям. Сообщения должны отправляться как в зашифрованной форме, так и в форме открытого
Правило 45: Разрабатывайте шаблоны функций-членов так, чтобы они принимали «все совместимые типы»
Правило 45: Разрабатывайте шаблоны функций-членов так, чтобы они принимали «все совместимые типы» Интеллектуальные указатели – это объекты, которые ведут себя во многом подобно обычным указателям, но добавляют функциональность, которую последние не предоставляют.
11.2.2. Специализация отдельного объекта
11.2.2. Специализация отдельного объекта Я солипсист и, признаться, удивлен, что большинство из нас таковыми не являются. Из письма, полученного Бертраном Расселом В большинстве объектно-ориентированных языков все объекты одного класса ведут себя одинаково. Класс — это
9.4. Создание безопасных при исключениях функций-членов
9.4. Создание безопасных при исключениях функций-членов ПроблемаСоздается функция-член и необходимо обеспечить базовые и строгие гарантии ее безопасности при исключениях, а именно отсутствие утечки ресурсов и то, что объект не будет иметь недопустимое состояние в том
Определение членов класса
Определение членов класса Все члены класса по характеру доступа к ним делятся на четыре категории: закрытые (private), защищенные (protected), открытые (public) и опубликованные (published).Элементы класса, определенные в разделе public, без каких-либо ограничений открыты для доступа извне
10.6. Явная специализация шаблона А
10.6. Явная специализация шаблона А Не всегда удается написать шаблон функции, который годился бы для всех возможных типов, с которыми он может быть конкретизирован. В некоторых случаях имеется специальная информация о типе, позволяющая написать более эффективную
18.5.4. Видимость членов виртуального базового класса
18.5.4. Видимость членов виртуального базового класса Изменим наш класс Bear так, чтобы он имел собственную реализацию функции-члена onExhibit(), предоставляемой также ZooAnimal: bool Bear::onExhibit() { ... }Теперь обращение к onExhibit() через объект Bear разрешается в пользу экземпляра, определенного в
Определение шаблонного правила
Определение шаблонного правила Элемент xsl:template Синтаксис этого элемента приведен ниже:<xsl:template match="пaттерн" name="имя" priority="число" mode="имя"> <!-- Содержимое: несколько элементов xsl:param, тело шаблона --></xsl:template>Элемент верхнего уровня xsl:template определяет в
Вызов шаблонных правил
Вызов шаблонных правил Рассмотрим следующий простой пример.Листинг 5.1. Входящий документ<para><bold>text</bold></para>Попробуем написать пару шаблонов, которые будут изменять имена элементов para и bold на p и b соответственно. Сначала напишем преобразование для bold:<xsl:template
18.4.5. Прием потока ввода без применения шаблонных команд
18.4.5. Прием потока ввода без применения шаблонных команд После шаблонной части необязательно указывать команды; если после шаблонной части команды отсутствуют, до перехода к дальнейшей обработке выполняется фильтрация нежелательных откликов.Если в отдел учета следует
Видимость членов класса и модификаторы доступа
Видимость членов класса и модификаторы доступа Каждое поле, метод или свойство класса имеет модификатор (атрибут) доступа, задающий правила его видимости. В PascalABC.NET существуют четыре вида модификаторов доступа: public (открытый), private (закрытый), protected (защищенный) и internal