2009-05-29

MSVCはtypenameがお好き

以下はMSVCにおいて何の問題もなくコンパイルが通るコードである。

// テンプレート引数
template < typename typename typename typename typename typename typename typename typename typename T >
// 戻り値の型
typename typename typename typename typename typename typename typename typename typename T
// 関数名とその引数
f( typename typename typename typename typename typename typename typename typename typename T )
{
        // return文
        return typename typename typename typename typename typename typename typename typename typename T() ;
}

int main()
{
        // 明示的なテンプレート引数の型指定と共に、関数の呼び出し
        f< typename typename typename typename typename typename typename typename typename typename int >(0) ;
}

おそらく通常見ることのないコードであり、C++ネイテイブであっても、何を意味するのか、直感で理解できない人が多いであろうことが予想されるので、できるだけコメントを付けてみた。

いやはや、typenameをどこに指定して、どこに指定してはならないのかというのが、初心者には分かりにくい。なぜなら、Dependant nameという概念を理解していなければならないからだ。それならば、いっそのこと、制限を緩くして、どこでも指定できるようにしようぜという意見がある。現行のC++0xドラフトでその辺がどうなつているのかは知らないが、その意見を取り入れて先行実装しても、とくに実害のない制限緩和である。しかし、ここまでユルユルにするのはどうかとおもう。そもそも、なんで複数指定できるんだろう。

参考:[C++] typename なんてただの飾りです。VCにはそれがわかっています。

No comments: