C#でCRTP

これを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)