っていうか,自分が何か趣味で C++ のコンポーネントを書くときは,何かしらのタスクに対して,「それをどういう構文で書きたいか」というモチベーションの下で考えながら書き始めるという,本末転倒の極みな傾向があるというのを念頭においていただいた上で.
以下の構文が達成できたらめがっさにょろにょろ.
// パス ph からルートディレクトリに至るまで再帰的に昇っていきながら, // "main.cpp" という名前のファイルが無いかを探して,見つかったらそのパスを返す. using namespace boost::lambda; namespace fs = boost::filesystem; namespace range = cradle::range; namespace view = cradle::view; namespace cfs = cradle::filesystem; fs::path ph = "/foo/bar/baz"; boost::optional< fs::path > maybe_ph = range::maybe_find_if( view::iterate( ph, cfs::branch_path( _1 ) ) | view::take_while( !cfs::path_empty( _1 ) ) | view::concat_map( cfs::view::directory_contents( _1 ) ) | view::filter( !cfs::is_directory( _1 ) ) , cfs::path_leaf( _1 ) == "main.cpp" );
// 上と探索順序が逆.つまりルートから ph にまで再帰的に降りてきながら探す using namespace boost::lambda; namespace fs = boost::filesystem; namespace range = cradle::range; namespace view = cradle::view; namespace cfs = cradle::filesystem; fs::path ph = "/foo/bar/baz"; boost::optional< fs::path > maybe_ph = range::maybe_find_if( cfs::view::path_elements( ph ) | view::map( ctor< fs::path >( _1 ) ) | view::scanl1 | view::concat_map( cfs::view::directory_contents( _1 ) ) | view::filter( !cfs::is_directory( _1 ) ) , cfs::path_leaf( _1 ) == "main.cpp" );