Step 6 (S-11486)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/566/step/6

Специализация шаблонов для получения информации о типах используется в C++ довольно активно. Например, для простых типов вроде char или int функция copy_n (которую вы реализовали раньше) может использовать memcpy. Использование memcpy может оказаться быстрее, чем поэлементное копирование массива.

Давайте создадим шаблон TriviallyCopyable, который позволит узнать, допустимо ли для данного типа побайтовое копирование вместо вызова конструктора копирования или оператора присваивания. Как может выглядеть такой шаблон:


template <typename T>struct TriviallyCopyable{ static const bool value = false; };


Если значение value == true, значит для копирования можно использовать memcpy. В шаблоне выше значение value по умолчанию равно false, потому что безопасно считать, что тип нельзя копировать с использованием memcpy (возможно, мы немного проиграем от этого в скорости, но не в правильности).

Функция copy_n может теперь использовать значение TriviallyCopyable<T>::value, чтобы выбрать общую реализацию или реализацию с использованием memcpy. Однако, чтобы от TriviallyCopyable была польза, нужно специализировать его так, чтобы для простых типов value было равно true, например, так:


template <> structTriviallyCopyable<char>{ static const bool value = true; };


Аналогичным образом, мы можем специализировать TriviallyCopyable для типов (классов), определенных пользователем (если их, конечно, действительно можно копировать с использованием memcpy). Выигрыш по сравнению со специализацией/перегрузкой функции copy_n заключается в том, что класс TriviallyCopyable может использовать не только copy_n, а любая другая функция или класс, для которой эта информация может оказаться полезной.