2011-03-01

C++0xの非常に分かりにくい宣言

非常に分かりにくい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
;

もちろん、通常のプログラマーは、このようなコードを理解する必要はない。

2 comments:

Anonymous said...

最後の余計なセミコロンも C++0x の新しい文法で認められるようなったものですね。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#569

江添亮 said...

そういえば余計だったw