テンプレートVSジェネリック ~メタプログラミング頂上決戦~

どうも。プログラマのマツノブです。

今日はC++のTemplateとC#のGenericの違いについてお話したいと思います。

まずは2値のうち大きい方の値を返す関数[Max]を例に見ていきましょう。

C++テンプレート

 

C#ジェネリック

 

C#ジェネリックには普段C++を使っている方には見慣れない記述があるのがわかると思います。

where T : IComparable

これはC#では制約と呼びます。

C#のジェネリックメソッドには上で言うところのT型が満たすべき条件を記述する必要があります。

where T : IComparable はT型はIComparableインターフェイスの実装をしている必要があるという指定です。

IComparableはインスタンスの並べ替えを目的とした汎用的な比較メソッドを持つインターフェイスで、IComparableインターフェイスはCompareToを持っており2値の比較を行います。

C++テンプレートと同じように比較演算子を使えばいいと思う方もいると思いますが、C#ジェネリックでは比較などの演算子を使うことができません。

そういう点ではC++テンプレートのほうが便利かもしれませんね。

C#の制約には次のようなものがあります。

where T : struct T型は値型である
where T : class T型は参照型である
where T : new() T型は引数なしのコンストラクタを持つ
where T : (baseclass) T型は(baseclass)を継承している
where T : (interface) T型は(interface)インターフェイスを実装している

複数の制約を指定することができますがその場合全ての制約を満たす必要があり、引数なしのコンストラクタに関する制約は末尾に付ける必要があります。

メタプログラミングはいまやプログラムのトレンド!

みなさんもテンプレートやジェネリックを学んでナウでヤングなコードを書いていきましょう。

それでは、今日はここまで

Tweet about this on TwitterShare on Facebook0Share on Google+0

コメント投稿は締め切りました。