どうも。プログラマのマツノブです。
今日はC++のTemplateとC#のGenericの違いについてお話したいと思います。
まずは2値のうち大きい方の値を返す関数[Max]を例に見ていきましょう。
C++テンプレート
1 2 3 4 5 6 |
template<typename T> T Max(T a, T b){ return a > b ? a : b; } auto max = Max(1, 10); |
C#ジェネリック
1 2 3 4 5 6 |
public static T Max<T>(T a, T b) where T : IComparable { return a.CompareTo(b) > 0 ? a : b; } var max = Max(1, 10); |
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)インターフェイスを実装している |
複数の制約を指定することができますがその場合全ての制約を満たす必要があり、引数なしのコンストラクタに関する制約は末尾に付ける必要があります。
1 2 3 4 5 6 |
public T hoge<T, U>(U a, U b) where T : class, new() where U : IComparable { .... } |
メタプログラミングはいまやプログラムのトレンド!
みなさんもテンプレートやジェネリックを学んでナウでヤングなコードを書いていきましょう。
それでは、今日はここまで
(Visited 2,505 times, 1 visits today)