Szablony można zrealizować za pomocą nagłówków szablonów.
Let Foo.h tak:
#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
Aby go użyć można zrobić:
#define T char*
#define PREFIX pchar_
#include "foo.h"
#define T int
#define PREFIX int_
#include "foo.h"
Teraz masz pchar_foo()
i int_foo()
których można użyć.
Zaletą tego jest to, że jeśli występuje problem z kompilacją, w nagłówku szablonu pojawia się numer wiersza, a nie kompilator, który twierdzi, że makro jest niepoprawne, a kodowanie działa również w niektórych środowiskach IDE.
Makra są bardzo popularne, więc wyodrębniłem ich definicję do osobnego nagłówka, a ich niezdefiniowanie do innego.
Zaimplementowałem części STL przy użyciu tego wzoru dla zabawy i używam go w niektórych moich projektach C.
Czasami można również użyć makr do emulowania zachowania szablonu. – Lucas
W C++ używałbyś przesłonięcia nie szablonów dla tego przeciążenia – Motti
@Motti, nieprawdaż? – Amarghosh