2010-09-14

gccにrange-based forが実装された

gccにrange-based forが実装されたので、検証した。バグは見つからなかった。残念。Rodrigo Rivas Costaはいい仕事をしたと言える。

さて、そろそろrange-based forの説明も執筆しなければならないのだが、さてどうするか。range-based forを理解するには、ADLを理解していなければならない。また、ライブラリとしてのイテレーターの仕組みも、理解していなければならない。range-based forは、非常に簡単にループが書けるので、初心者におすすめなのだが、いかんせん、その仕組が難しい。本末転倒も甚だしい。

そういう理由で、私はrange-based forを嫌っていたのだが、いざ実際に使ってみると、これがなかなか便利だ。うーむ。

namespace NS
{
    struct Member_range
    {
        int a[3] ;
        Member_range() : a{ 1, 2, 3 }
        { }
        
        int * begin() { return &a[0] ; }
        int * end() { return &a[3] ; }
    } ;

    struct Non_member_range
    {
        int a[3] ;
        Non_member_range() : a{ 1, 2, 3 }
        { }
    } ;
    
    int * begin( Non_member_range & r ) { return &r.a[0] ; }
    int * end( Non_member_range & r ) { return &r.a[3] ; }
}


int main()
{
    // initializer list
    for ( auto i : { 1, 2, 3 } )
    { std::cout << i << std::endl ; }

    // array
    int a[] = { 1, 2, 3 } ;
    for ( auto i : a )
    { std::cout << i << std::endl ; }

    // range aware class
    NS::Member_range r1;
    for ( auto i : r1 )
    { std::cout << i << std::endl ; }

    // class with associated range functions
    NS::Non_member_range r2 ;
    for ( auto i : r2 )
    { std::cout << i << std::endl ; }
    
}

Public Git Hosting - official-gcc.git/commit
GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)

2 comments:

萌ゑ said...

なんかC#みたいになってきたなあ。C#も3.0の頃からLINQが入って来たり式ツリーが導入されたりどんどん複雑さを増しています。

その反面コーディング時には自然な思考の流れを邪魔される事が少なくなり、比較的楽に製品にこぎ着ける事が出来るようになったと思います。

C++0xも明らかにC#の影響があるなあ。

江添亮 said...

近代的な言語はいずれも、如何にして簡単なループ構文を提供するかということに力を入れていますね。