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:

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

    ReplyDelete
  2. そういえば余計だったw

    ReplyDelete

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.