generic.h

template無しで型安全なコンテナを作るには、昔っからgeneric.hというものがあります。
詳細は「επιστημηオブジェクト指向的日常」isbn:4881358022の付録CD-ROM収録のバックナンバー記事にありますが、ざっと抜き出すとこんな様子です。

#define name2(x, y) x##y
#define declare(c, t) name2(c, declare)(t)
#define implement(c, t) name2(c, implement)(t)

使い方はhttp://h30097.www3.hp.com/cplus/clu003.htm……ではなんですからサンプル挙げときます。

#include "generic.h"

#define stack(T) name2(T, stack)
#define stackdeclare(T) typedef struct { ... } stack(T);
#define stackimplement(T) ...

declare(stack, int) /* 普通は.hに置く */

implement(stack, int) /* どっかの.cに置く */

int main()
{
    stack(int) s;
    ...
    return 0;
}

マクロの##隠しただけじゃね!?という突っ込みはしないでおいてあげましょう……仮にも昔実際に使われていたヘッダーです。はあ。これだからC/C++は。