Hatena::ブログ(Diary)

wordiの日記 このページをアンテナに追加 RSSフィード

2005 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11| 12|
2006 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11| 12|
2007 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11| 12|
2009 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11| 12|
2010 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11| 12|
2011 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11| 12|
2012 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11| 12|
2013 | 01| 02| 03| 04| 05| 06| 07| 08| 09| 10| 11|
iPhone プログラミング D言語 日記 ゲーム 仕事 出来事 ねた ソフトウェア 囲碁

2013-11-28

[]C++14関数戻り値型推論 C++14関数の戻り値の型推論を含むブックマーク 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に纏められ、

無駄な処理を行わずにコードの冗長性を省く事が出来ました、こりゃ便利。