テンプレートクラスを作成するこのプリプロセッサ依存の方法を発見したとき、私はちょうどいじっていました:
#include <iostream>
#include <typeinfo>
// Is this a valid template class?
#define TEMPLATE_CLASS(T)\
class TemplateClass_ ## T\
{\
private:\
T value;\
public:\
void print_type()\
{\
std::cout << typeid(T).name() << std::endl;\
}\
}
class Sample {};
TEMPLATE_CLASS(int) obj1;
TEMPLATE_CLASS(char) obj2;
TEMPLATE_CLASS(Sample) obj3;
int main(int argc, char* argv[])
{
obj1.print_type();
obj2.print_type();
obj3.print_type();
}
これを次のように簡単にコンパイルしました。
g++ src.cpp -o main.exe
出力:
i
c
6Sample
ご覧のとおり、テンプレート クラスとほとんど同じように機能します。オブジェクトはグローバルにしか宣言できないという明らかな事実を除いて、実際には を使用するときに新しいクラスをインラインで定義し、新しいクラスTEMPLATE_CLASS(T)
を関数内で定義することはできません。これに対する解決策は次のとおりです。
TEMPLATE_CLASS(float);
int main() { TemplateClass_float obj; }
とにかく色々と考えさせられました。まず、これを有効なジェネリック クラスと呼ぶことはできますか? では、標準のテンプレート機能の代わりに使用できる可能性はありますか? 明らかに、標準のテンプレート機能を使用する方がはるかに便利ですが、私が言いたいのは、これでも同じように機能するかということです。最後に、C++ 標準によって定義されたテンプレート機能は、プリプロセッサで行っていることと同様のことを内部的に行いますか? そうでない場合、この実装と C++ の標準テンプレート機能の違いは何ですか?