|
Программирование >> Разработка устойчивых систем
Упражнения Напишите шаблон унарной функции, получающий один типовой параметр. Создайте полную специализацию для типа int. Также создайте нешаблонную перегрузку этой функции с одним параметром типа int Вызовите в main() три разновидности функции. Напишите шаблон класса, использующий класс vector для реализации стековой структуры данных. Измените решение из предыдущего упражнения так, чтобы тип контейнера, используемого для реализации стека, определялся шаблоном, являющимся параметром шаблона. В следующем фрагменте класс NonComparable не содержит операторной функции operator-(). Почему присутствие структуры HardLogic приводит к ошибке компиляции, а структуры SoftLogic - нет? : C05:Exerc1se4.cpp {-хо} class Noncomparable {}: struct HardLogic { Noncomparable ncl. nc2; void compareO { return ncl == nc2: Ошибка компилятора tempiate<class T> struct SoftLogic { Noncomparable ncl, nc2: Cm. http: www.bdsoft.com/tools/stlfilt.htmL многие компиляторы выдают очень длинные и абсолютно невразумительные сообщения. В последнее время сообщения об ошибках шаблонов в компиляторах С++ были несколько усовершенствованы, а Леор Золман (Leor Zolman) написал утилиту STLFilt, которая извлекает из этих сообщений полезную информацию и выкидывает все лишнее. Еще одной важной идеей этой главы является то, что шаблон подразумевает интерфейс. Иначе говоря, хотя ключевое слово template означает: Подойдет любой тип ; код определения шаблона требует поддержки некоторых операций и функций ic/iacca, то есть обеспечения определенного интерфейса. Так что на самом деле определение шаблона означает Подойдет любой тип, поддерживающий данный интерфейс . Конечно, было бы хорошо, если бы компилятор мог просто сказать: Тип, по которому параметризуется этот шаблон, не поддерживает этот интерфейс - ничего не выйдет . Шаблоны организуют своего рода отложенную проверку типов , более гибкую по сравнению с традиционной объектно-ориентированной практикой порождения всех типов от некоторых базовых классов. В главах 6 и 7 подробно рассматривается самое известное применение шаблонов - подмножество стандартной библиотеки С++, называемое стандартной библиотекой шаблонов (Standard Template Library, STL). В главах 9 и 10 также встречаются приемы использования шаблонов, не упомянутые в этой главе. void noOpO {} void compareO { ncl ~ nc2: int mainO { SoftLogic<Noncomparable> 1: l.noOpO: } III:- 5. Напишите шаблон функции с одним типовым параметром Т. Функция получает четыре аргумента: массив Т, начальный индекс интервала, конечный индекс интервала и необязательное исходное значение. Функция возвращает сумму всех элементов массива в заданном интервале (с включением конечного индекса) и исходного значения. Исходное значение по умолчанию должно создаваться конструктором Т по умолчанию. 6. Повторите предыдущее упражнение и создайте переопределенные специализации для int и double способом, описанным в этой главе. 7. Почему не компилируется следующая программа? В качестве подсказки попробуйте ответить, к чему получают доступ функции класса? : С05:Exercise?.срр {-хо} class Buddy {}: tempiate<c1ass T> class My { int i: public: void p1ay(My<Buddy>& s) { s.i - 3: int mainO { My<int> h; My<Buddy> me. bud: h.play(bud): me.play(bud): } III:- Почему не компилируется следующая программа? : С05:Exercises.срр {-хо} tempiate<c1 ass Т> double pythagd a. T b. T c) { return (-b + sqrt(doub1e(b*b - 4*a*c))) / 2*a: int mainO { pythagd. 2. 3): pythagd.0. 2.0. 3.0): pythagd. 2.0. 3.0): pythag<double>(l. 2.0. 3.0): } III:- 8. Напишите шаблон с нетиповыми параметрами следующих видов: i nt, указатель на int, указатель на статическую переменную класса типа int, указатель на статическую функцию класса. 9. Напишите шаблон класса с двумя типовыми параметрами. Определите неполную специализацию для первого параметра, а затем другую неполную специализацию второго параметра. Включите в каждую специализацию члены, отсутствующие в основном шаблоне. 10. Определите шаблон класса Bob с одним типовым параметром. Объявите Bob дружественным для всех специализаций шаблонного класса Friendly и для шаблонного класса Picky только при совпадении типов параметров Bob и Picky. Включите в Bob функции, демонстрирующие дружественные отношения между классами.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |