C++14関数の戻り値の型推論
Boost Range Ovenを使ったサンプル
上記だけだと何が便利かピンと来ないですが、複雑な型をautoだけで済ませられるようになったという事は、templateを駆使したクラスを戻り値として使うのが手軽になったという事です。
以下がサンプル、環境はGCC 4.8.1、Boost 1.55.0です。
※コンパイル時に-std=c++1yを渡しています。
#include <iostream> #include <vector> #include <boost/range/adaptors.hpp> using namespace std; using namespace boost; using namespace boost::adaptors; template <class Range> std::vector<typename Range::value_type> to_vector(const Range &r) { return {std::begin(r), std::end(r)}; } class Array { public: Array(std::vector<int> v) : v(v) { } private: auto overQuery(int min) { return v | filtered([min](int x) { return x >= min; }); } public: // 指定の値以上がある? bool existOver(int min) { // ※boost::emptyは、渡されたRangeのiteratorのbegin、endが同じ位置がチェックしてるだけ return not empty(overQuery(min)); } // 指定の値以上の一覧を返す std::vector<int> toOver(int min) { return to_vector(overQuery(min)); } private: std::vector<int> v; }; int main(){ auto a = Array({1, 2, 3, 4, 5}); for (auto x : a.toOver(3)) cout << x << " "; cout << endl; cout << a.existOver(2) << std::endl; cout << a.existOver(6) << std::endl; return 0; }
実行結果
3 4 5 1 0
配列に対して、ある値以上を取得したり、存在してるかをチェックしています。
従来だと無駄な処理が発生しないようにexistOverとtoOverそれぞれに似たような処理を書く必要がありました。
それがBoot Range Ovenによって内部関数のoverQueryに纏められ、
無駄な処理を行わずにコードの冗長性を省く事が出来ました、こりゃ便利。