これをCRTPと呼んでいいのかわからないけど
Curiously Recurring Template in C#? No way...
using System; using System.Collections.Generic; using System.Text; namespace Program { interface IF { void Foo(); } class Base<T> where T:class, IF { public void BaseFoo() { (this as T).Foo(); } } class Derived : Base<Derived>, IF { public void Foo() { Console.WriteLine("Derived::Foo()"); } } class Program { static void Main(string[] args) { Derived hoge = new Derived(); hoge.BaseFoo(); } } }
CRTPの定義は「基本クラスのテンプレート引数に自分を指定すること」なので
これもCRTPということでいいのかも
いちおうC++でのCRTP
#include <iostream> using namespace std; template <class T> struct Base { void BaseFoo() { static_cast<T&>(*this).Foo(); } }; struct Derived : Base<Derived> { void Foo() { cout << "Derived::Foo()" << endl; } }; int main() { Derived hoge; hoge.BaseFoo(); return 0; }
Wikipedia - Curiously recurring template pattern
日本語のCRTP解説だとこのへん
http://ja.wikipedia.org/wiki/テンプレートメタプログラミング
C++ Labyrinth - 自己言及的なテンプレート(2)