非常に分かりにくいC++0xの宣言を考えてみた。もちろん、識別子やインデントによって、C++のコードを読みにくくすることは可能だ。ここでは、そのような難読化ではなく、文法上、こう書かなければならないものだ。
namespace NS { template < typename T > struct X { template < typename U > void Y(U) { } } ; } template < > template < > void NS::X<int>::Y<int>(int) { } ;
これは、C++0xの新機能をふたつも使った、非常に分かりにくい宣言だ。C++では、テンプレートを宣言した名前空間スコープの外側で、テンプレートの特殊化や部分的特殊化を宣言できる。その際には、名前の修飾が必要である。また、関数は特殊化できる。
template < > // explicit-specialization for template class NS::X template < > // explicit-specialization for template function NS::X::Y void // return type of specializations of template function NS::X::Y NS:: // namespace qualification X<int>:: // specialization for template class NS::X Y<int>(int) // function declaration { } // function body ;
もちろん、通常のプログラマーは、このようなコードを理解する必要はない。
最後の余計なセミコロンも C++0x の新しい文法で認められるようなったものですね。
ReplyDeletehttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#569
そういえば余計だったw
ReplyDelete