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)
なんかC#みたいになってきたなあ。C#も3.0の頃からLINQが入って来たり式ツリーが導入されたりどんどん複雑さを増しています。
ReplyDeleteその反面コーディング時には自然な思考の流れを邪魔される事が少なくなり、比較的楽に製品にこぎ着ける事が出来るようになったと思います。
C++0xも明らかにC#の影響があるなあ。
近代的な言語はいずれも、如何にして簡単なループ構文を提供するかということに力を入れていますね。
ReplyDelete