Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование на C++.pdf
Скачиваний:
61
Добавлен:
23.03.2016
Размер:
1.88 Mб
Скачать

Cпециализация шаблона класса

Базовые

сведения

Обобщённое программирова- ние

Объявление

шаблонов

Порождение

1

кода

2

Специализация

 

шаблонов

3

Перегрузка

4

операций

5

 

Исключения

6

 

7

 

8

 

9

 

10

 

11

 

12

 

13

 

14

 

15

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

template < typename T , size_t N > class Tuple

{

private :

T a[N ];

public :

 

T get ( int i );

 

void set ( int i , T

x );

};

 

template < typename T ,

size_t N >

T Tuple <T ,N >:: get ( int

i) { return a[i ]; }

template < typename T , size_t N >

void Tuple <T ,N >:: set ( int i , T x) { a[i] = x; }

62 / 99

Пример: специализация шаблона класса

Базовые

 

сведения

17

Обобщённое

18

 

программирова-

19

ние

20

Объявление

 

шаблонов

21

Порождение

22

кода

 

Специализация

23

шаблонов

24

 

Перегрузка

25

операций

 

 

26

Исключения

27

 

 

28

 

29

 

30

 

31

 

32

 

33

 

34

 

35

template <>

 

class Tuple < bool ,

8>

{

 

private :

 

unsigned char

a;

public :

 

bool get ( int i );

void set ( int i , bool x );

};

bool Tuple < bool ,8 >:: get ( int i)

{

return (a >> i) & 1;

}

void

Tuple < bool ,8 >:: set ( int

i , bool x)

{

 

 

a

|= ( unsigned char )x <<

i;

}

 

 

63 / 99

Частичная специализация шаблона класса

Базовые

 

сведения

 

Обобщённое

 

программирова-

 

ние

37

Объявление

38

шаблонов

 

Порождение

39

кода

40

Специализация

41

шаблонов

 

Перегрузка

42

 

операций

43

Исключения

44

 

45

 

46

 

47

 

48

 

49

 

50

 

51

При частичной специализации фиксируется только часть фактических параметров шаблона. Например,

template < typename T > class Tuple <T ,1 >

{

private : T a;

public :

T get ( int i );

void set ( int i , T x );

};

template < typename T >

T Tuple <T ,1 >:: get ( int i) { return a; }

template < typename T >

void Tuple <T ,1 >:: set ( int i , T x) { a = x; }

64 / 99

Вычисления во время компиляции

Базовые

сведения

Обобщённое программирова- ние

Объявление

шаблонов

Порождение

5

кода

 

Специализация

6

шаблонов

7

 

Перегрузка

8

операций

 

 

9

Исключения

10

 

 

11

 

12

 

13

 

14

 

15

 

16

 

17

 

18

 

19

 

20

Специализация шаблонов позволяет заставить компилятор выполнить некоторые вычисления во время компиляции. Например, можно попросить компилятор вычислить факториал числа:

template <int N >

 

struct Fact

{

 

static

const unsigned long val =

N

*

Fact <N -1 >:: val ;

};

 

 

 

template

<>

 

 

struct Fact <0 > {

 

static

const unsigned

long val = 1;

};

 

 

 

int main ()

 

 

{

 

 

 

cout

<<

Fact <3 >:: val

<< ’\n ’;

return

0;

 

}

 

 

65 / 99