Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9749

Genericsでテンプレートの特殊化みたいなことをする

$
0
0

結論

https://stackoverflow.com/a/29379250に載ってる方法で、1回分の仮想関数の呼び出しコストが増えるけどGenericsの特殊化みたいなことができる。

どういうことか

↓のようなコードを書くと、 Hogeの型引数 Tintdoubleのときは Hoge<T>.P.Funcはなんらかの値を返してくれるけど、それ以外の場合は NotSupportedExceptionを投げるようになる。

Hoge.PIHoge<int>IHoge<double>にしかキャストできないので、

  • Tintdoubleのとき、 Hoge<T>.PHoge.Pで初期化される
  • Tがそれ以外の場合は Hoge.P as IHoge<T>nullになるので、 Hoge<T>.Pnew Hoge<T>()で初期化される

というように、Tintdoubleのときだけ Hoge<T>.PがGenericじゃない方の Hogeで初期化されるのでこうなる。

publicinterfaceIHoge<T>{TFunc(Tvalue);}publicclassHoge<T>:IHoge<T>{publicstaticreadonlyIHoge<T>P=Hoge.PasIHoge<T>??newHoge<T>();publicTFunc(Tvalue){thrownewNotSupportedException();}}publicclassHoge:IHoge<int>,IHoge<double>{publicstaticreadonlyHogeP=newHoge();publicintFunc(intvalue){returnvalue;}publicdoubleFunc(doublevalue){returnvalue;}}

Viewing all articles
Browse latest Browse all 9749

Trending Articles