以下は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ドラフトでその辺がどうなつているのかは知らないが、その意見を取り入れて先行実装しても、とくに実害のない制限緩和である。しかし、ここまでユルユルにするのはどうかとおもう。そもそも、なんで複数指定できるんだろう。
No comments:
Post a Comment