Теперь шаблоны в C ++ нарушают этот принцип, bcoz C ++ - это скомпилированный язык. И компилятор генерирует весь необходимый код во время компиляции. Теперь, чтобы придерживаться ООП, мы получаем хрупкие шаблоны, которые на 100% не являются общими по своей природе.
Разделяйте декларацию и определения (реализация SHARING)
Если вы просто хотите сохранить все в чистоте и порядке, тогда вы можете включить свой файл реализации в другой заголовок. Я думаю, что это должен быть заголовочный файл, так как это соответствует базовому соглашению о том, что мы совместно используем файлы .h и сохраняем файлы .cc для совместного использования (пока вы не передаете сам код). Вот как выглядят файлы.
foo.h
Это простой файл, включающий foo_impl.h
.
#ifndef FOO_H
#define FOO_H
template <class T>
class Foo {
public:
Foo (T);
T get();
private:
T data;
};
#include "foo_impl.h"
#endif
foo_impl.h
Этот немного отличается от норм. Здесь мы не охраняем содержимое заголовочного файла. Вместо этого мы выдадим ошибку, если кто-то включит foo_impl.h
напрямую (что в нашем случае не имеет смысла).
#ifndef FOO_H
#error 'foo_impl.h' is not supposed to be included directly. Include 'foo.h' instead.
#endif
template <class T>
Foo <T> :: Foo (T stuff) {
data = stuff;
}
template <class T>
T Foo <T> :: get () {
return data;
}
Теперь, если кто-то попытается включить foo_impl.h
напрямую, получит ошибку вроде:
foo_impl.h:2:2: error: #error 'foo_impl.h' is not supposed to be included directly. Include 'foo.h' instead.
ПЛЮСЫ:
- Разделение задач, реализация и декларации находятся в отдельных файлах.
- Файл реализации безопасной защиты, исключающий случайное включение.
- Файл заголовка, используемый для включения, не раздувается с кодом реализации.
МИНУСЫ:
- Как уже упоминалось выше, необходимо поделиться реализацией.
Хранить декларацию и определения отдельно (НЕ РАЗДЕЛИТЬ реализацию)
Чтобы не делиться кодом для шаблонов, вы должны определить все возможные типы данных, с которыми ваш шаблон может использоваться в файле .cc / .cpp, например:
template class foo< int >;
template class foo< double >;
ПЛЮСЫ:
- Разделение задач, реализация и декларации находятся в отдельных файлах.
- Не нужно делиться своей реализацией
МИНУСЫ:
- Не слишком общий. Нужно знать заранее, что требуется.