マクロを使用して、C で C++ テンプレートを [かなり厳密に] シミュレートできます。
これを行うには、少なくとも 2 つの方法があります。
最初の方法:「ゴム印」マクロ
関数のマクロの宣言/定義を定義する
#define DECLARE_READ_WRITE(suffix, type)\
type Read_Value_##suffix(void);
void Write_Value_##suffix(type val);
#define DEFINE_READ_WRITE(suffix, type)\
type Read_Value_##suffix(void) {\
/* your code */ \
}\
void Write_Value_##suffix(type val) {\
/* your code */ \
}
そして、いくつかのヘッダーファイルで
DECLARE_READ_WRITE(long, long)
DECLARE_READ_WRITE(int, int)
そして、いくつかの実装ファイルで
DEFINE_READ_WRITE(long, long)
DEFINE_READ_WRITE(int, int)
Read_Value_int
、Write_Value_int
、 Read_value_long
およびの宣言と定義を「生成」しWrite_value_long
ます。
2 番目の方法: パラメータ化されたインクルード ファイル
2 つのヘッダー ファイルを作成します。宣言用 ( read_write.h.template
)
TYPE__ CONCAT(Read_Value_, SUFFIX__)(void);
void CONCAT(Write_Value_, SUFFIX__)(TYPE__ val);
および定義用の 1 つ ( read_write.c.template
)
TYPE__ CONCAT(Read_Value_, SUFFIX__)(void)
{
/* your code */
}
void CONCAT(Write_Value_, SUFFIX__)(TYPE__ val)
{
/* your code */
}
CONCAT
これは、マクロ トークン連結の通常の実装です (最初のメソッドでも使用できます/使用する必要があります) 。
次に、「テンプレート化された」コードを適切なヘッダー ファイルと実装ファイルにインクルードします。
#define TYPE__ int
#define SUFFIX__ int
#include "read_write.h.template"
#undef TYPE__
#undef SUFFIX__
#define TYPE__ long
#define SUFFIX__ long
#include "read_write.h.template"
#undef TYPE__
#undef SUFFIX__
read_write.c.template
ヘッダー付きの実装ファイルでも同じです。
後者の方法には、デバッグ可能なコードを生成できるという追加の利点があります。つまり、C++ テンプレートで通常動作するのと同じように、デバッガーでステップ実行できます。