Вы можете написать шаблонные функции, полностью состоящие из заголовочных файлов. Тогда вам не нужны никакие файлы .cpp и вам не нужно ссылаться на объектные файлы. Хотя это не является прямым решением заданного вопроса, это способ «не связывать каждый объектный файл для каждой функции».
Собираем все вместе
Если мы приведем пример, вы можете попробовать изменить свой файл sort.h следующим образом
//sort.h file
#ifndef sort_h
#define sort_h
template <typename T>
void insertion_sort(T* a,int n) {
// insertion sort implementation goes here
}
template <typename T>
void merge_sort(T* a,int n) {
// merge sort implementation goes here
}
#endif
Когда вы пишете здесь свои процедуры сортировки в качестве шаблонных функций, ваша функция должна быть достаточно универсальной, чтобы ее можно было использовать для универсальных T-типов. В общем случае для процедур сортировки T должно быть меньше, чем сопоставимо.
Отдельный интерфейс и реализация
Если вам не нравится размещать документацию, интерфейс и реализацию в одном месте, вы можете сначала объявить функцию вместе с ее документацией. Затем вы можете определить его ниже или, возможно, в каком-то другом файле. Итак, возможно следующее:
//sort.h file
#ifndef sort_h
#define sort_h
/**
* Function documentation
*/
template <typename T>
void insertion_sort(T* a,int n);
/**
* Function documentation
*/
template <typename T>
void merge_sort(T* a,int n);
#include "insertion_sort.h"
#include "merge_sort.h"
#endif
//insertion_sort.h file
#ifndef insertion_sort_h
#define insertion_sort_h
template <typename T>
void insertion_sort(T* a, int n) {
// insertion sort implementation goes here
}
#endif
//merge_sort.h file
#ifndef merge_sort_h
#define merge_sort_h
template <typename T>
void merge_sort(T* a, int n) {
// merge sort implementation goes here
}
#endif
Некоторые люди любят называть файлы реализации заголовков шаблонов .tpp файлами. Это зависит от ваших предпочтений.
Использование From main.cpp
Вы можете использовать первый или второй параметры из main.cpp следующим образом:
//main.cpp
#include "sort.h"
#include <vector>
int main() {
std::vector<int> vec_int;
// fill vector
insertion_sort(&vec_int[0], vec_int.size());
std::vector<double> vec_double;
// fill vector
merge_sort(&vec_double[0], vec_double.size());
}
1028 * Компиляция *
Поскольку мы не использовали никаких файлов cpp, теперь компиляция main.cpp должна быть такой простой, как
g++ -Wall -Wextra -g main.cpp
при условии, что main.cpp и наши заголовочные файлы находятся в одном каталоге. Если заголовочные файлы находятся в некотором каталоге с именем include, то мы компилируем с
g++ -Wall -Wextra -g -Iinclude main.cpp