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