Я читаю книгу по C ++ и нахожусь в разделе об уменьшении объектного кода, сгенерированного шаблонами ( Effective C ++ III, Скотт Мейерс ).Один из приведенных примеров:
template <typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
SquareMatrix()
: SquareMatrixBase<T>(n, 0),
pData(new T[n*n])
{ this->setDataPtr(pData.get()); }
... functions ...
private:
boost::scoped_array<T> pData;
};
, где базовый класс SquareMatrixBase имеет функцию с именем:
void invert(std::size_t matrixSize);
«Книга переходит к« Независимо отгде данные хранятся, ключевой результат с точки зрения раздувания состоит в том, что теперь многие - возможно, все - функции-члены SquareMatrix могут быть простыми встроенными вызовами не встроенных версий базового класса, которые совместно используются всеми другими матрицами, содержащимиодин и тот же тип данных, независимо от их размера. "
Что означает" встроенные вызовы не встроенных версий базового класса ... "? Если бы это был встроенный вызов, я бы подумалпоместил бы версию базового класса любой функции в место, где использовался inline, но это привело бы к тому же самому взлому кода, как я думал. Это говорит о том, что это преимущество против взлома кода.
Если вам нужна дополнительная справочная информация, дайте мне знать, хотя главы длинные, и я очень старался предоставить справочную информацию, но я мог бычто-то пропустил.
|| РЕДАКТИРОВАТЬ - Дополнительная информация ||
Целью создания квадратной матрицы и квадратной матрицы в этом отрывке было:
SquareMatrix изначально был автономным шаблоном (не производным).Он содержал ряд функций, которые выполняли операции на основе значения параметра шаблона n.Таким образом, по существу была копия каждой функции для каждого используемого значения n (или для каждой пары n, T), поскольку для каждой пары параметров был создан новый шаблон с этими функциями.SquareMatrixBase был создан для перемещения функций, зависящих от параметра размера, в базовый класс.Поскольку базовый класс создается только с параметром типа (а не с размером), функции в базовом классе можно вызвать, передав значение размера, которое производный класс передает в конструктор базового класса.Это означает, что существует только одна версия функций для каждого typename T, переданного в шаблон SquareMatrix, независимо от переданного std :: size_t n (в отличие от одной версии каждой функции для каждой комбинации {T, n}.