C++14関数の戻り値の型推論

戻り値の型推論について

C++14から戻り値の型推論が使えるようになり、例えば、以下の関数も正常に動作します。

auto getThree() { return 3; } // 戻り値の型はint

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に纏められ、
無駄な処理を行わずにコードの冗長性を省く事が出来ました、こりゃ便利。