суббота, 9 апреля 2011 г.

Тест. Хорошо ли вы знаете шаблоны C++?

Встретил в книге Герба Саттера "Решение сложных задач на C++" следующий интересный тест на знание шаблонов C++:

1. Что такое специализация шаблона? Приведите пример.

2. Что такое частичная специализация шаблона? Приведите пример.

3. Рассмотрим следующие объявления:


// 1
template<typename T1, typename T2>
void g(T1, T2);

// 2
template<typename T>
void g(T);

// 3
template<typename T>
g(T, T);

// 4
template<typename T>
g(T*);

// 5
template<typename T>
g(T*, T);

// 6
template<typename T>
g(T, T*);

// 7
template<typename T>
g(int, T*);

// 8
template<>
void g<int>(int);

// 9
void g(int, double);

// 10
void g(int);

Какие из этих функций будут вызваны в каждой из следующих инструкций?
Где это возможно, укажите типы параметров шаблонов:


int i;
double d;
float f;
complex c;

// a
g( i );

// b
g<int>( i );

// c
g( i, i );

// d
g( c );

// e
g( i, f );

// f
g( i, d );

// g
g( c, &c );

// h
g( i, &d );

// i
g( &d, d );

// j
g( &d );

// k
g( d, &i );

// l
g( &i, &i );

Очевидно, задача на понимание и знание правил разрешения перегрузок, а также приоритетов перегрузок и специализаций. Но решение не так очевидно. Развлекайтейсь :)
(ответы смотрите сами в Саттере (задача 1.17), либо могу по просьбе прислать в личку)

4 комментария:

  1. Я дал следующие ответы:
    a - 10
    b - 8
    c - 3
    d - 2
    e - 1
    f - 9
    g - 6
    h - 7
    i - 5
    j - 4
    k - 1
    l - 1

    ОтветитьУдалить
  2. Вот мои ответы:
    a. 10
    b. 8
    c. 3
    d. 2
    e. 1
    f. 9
    g. 6
    h. 7
    i. 5
    j. 4
    k. 1
    l. 3

    ОтветитьУдалить
  3. Полностью согласен с ответами Алексея. Юлик, что там Саттер думает по поводу последнего вопроса? :-)

    ОтветитьУдалить
  4. Дада... Я прокидался на последнем :)

    ОтветитьУдалить