Java ジェネリックは、C++ テンプレートよりもboost::any
、単に変数に a を詰め込むことに近いです。self
試してみてください。C++ テンプレートは、既定では相互に実行時または動的な関係を持たない型を作成します。
pImpl
このような関係を手動で導入することができます。たとえば、共通の親とタイプの消去とスマート ポインターの賢明な使用を介してです。
C 型の可変引数は、C++11 のスタイルから外れています。可変引数テンプレート引数は、コンパイラがそれらをサポートしている限り、非常にタイプ セーフです (MSVC 2012 の 2012 年 11 月の CTP は、clang や gcc の古いバージョンと同様に、それらをサポートしています (更新 1、CTP ではありません))。
C++ のテンプレートは一種のメタプログラミングであり、Java Generics よりもプログラムを作成するプログラムを作成することに近いです。Java Generic には 1 つの共有「バイナリ」実装がありますが、C++ テンプレートの各インスタンスは完全に異なる「プログラム」(COMDAT フォールディングなどの手順を介して 1 つのバイナリ実装に縮小できます) であり、その詳細はテンプレートによって記述されます。コード。
template<typename T>
struct Field {
T data;
};
は、「フィールド タイプの作成方法は次のとおりです」という小さなプログラムです。andを渡すint
とdouble
、コンパイラは大まかに次のように処理します。
struct Field__int__ {
int data;
};
struct Field__double__ {
double data;
};
そして、これら 2 つの型の間で変換できるとは思わないでしょう。
一方、Java ジェネリックは次のようなものを作成します。
struct Field {
boost::any __data__;
template<typename T>
T __get_data() {
__data__.get<T>();
}
template<typename T>
void __set_data(T& t) {
__data__.set(t);
}
property data; // reading uses __get_data(), writing uses __set_data()
};
whereboost::any
は任意の型のインスタンスを保持できるコンテナーであり、data
フィールドへのアクセスはそれらのアクセサーを介してリダイレクトされます。
C++ は、テンプレート メタプログラミングを使用して、Java ジェネリックと同等のものを作成する手段を提供します。Java で C++ テンプレートのようなものを作成するには、Java プログラムでカスタム Java バイトまたはソース コードを出力し、コードをソースとして書き込むコードにデバッガーが接続できるようにそのコードを実行する必要があります。バグの。