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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.