Шаблоны могут быть реализованы с использованием заголовков шаблонов.
Пусть foo.h вот так:
#ifndef PREFIX
#define PREFIX
#endif
#define CCAT2(x, y) x ## y
#define CCAT(x, y) CCAT2(x, y)
#define FN(x) CCAT(PREFIX, x)
#ifndef T
#error Template argument missing.
#endif
void FN(foo)(int x, T t)
{
// Whatever.
}
#undef T
#undef PREFIX
#undef CCAT2
#undef CCAT
#undef FN
Чтобы использовать его, вы можете сделать:
#define T char*
#define PREFIX pchar_
#include "foo.h"
#define T int
#define PREFIX int_
#include "foo.h"
Теперь у вас есть pchar_foo()
и int_foo()
, которые вы можете использовать.
Преимущества этого состоят в том, что если возникает проблема со сборкой, вы получаете номер строки в заголовке шаблона, а не компилятор, который просто говорит, что макрос неправильный, и завершение кода также работает в некоторых IDE.
Макросы PREFIX
, CCAT
и FN
очень распространены, поэтому я выделил их определение в отдельный заголовок, а их определение - в другой.
Я реализовал части STL, используя этот шаблон для забавы, и использую его в некоторых своих проектах на C.