decltypeオペレータ


decltypeオペレータの説明:
1、C++では、decltypeがオペレータとして、式のデータ型をクエリーするために使用されます.decltypeはC++11標準制定時に導入され、主に汎用プログラミングのために設計され、汎用プログラミングではテンプレートパラメータによって決定されるタイプがあるため、表現が困難(不可能)な問題を解決する.汎用プログラミングは1990年代全体でますます流行し、タイプ導出メカニズムを実現する需要も生まれた.このため、多くのコンパイラメーカーは、プログラム言語の既存の機能に基づいて、typeofのようなオペレータを独自に実現しています.また、いくつかの機能は限られていますが、移植しやすい実装もあります.2002年、ビヤニー・ストロストルプはC++内でこのようなオペレータを標準化し、C++に加えることを提案した.式を取得する「宣言タイプ」(Declared Type)の機能を反映するために「decltype」とすることを推奨します.
2、意味的に言えば、decltypeの設計は汎用ライブラリ作成者とプログラミング初心者に適している.全体的に、decltypeによって導出されたタイプは、ターゲットオブジェクトまたは関数についてソースコードの定義と正確に一致することができる.sizeofオペレータのようにdecltypeもオペランドを評価する必要はありません.
例:
#include<iostream>
#include<string>
using namespace std;

string::size_type FindChar(const string &s, char c, string::size_type &count)
{
	auto ret = s.size();  //     ,     ,        ret
	count = 0;
	for (decltype(ret) i = 0; i != s.size(); ++i)  //decltype  ret   
	{
		if (s[i] == c)
		{
			if (ret == s.size())  //    ret == s.size()      C     ,       
				ret = i;
			++count;   //  if         ,           C   count
		}
	}
	return ret;
}

void Test()
{
	string s1("lilililililililililili");
	
	string::size_type Count = 0;;
	auto index = FindChar(s1,'l',Count);
	cout << "        :" << index << endl;
	cout << "Count = " << Count << endl;
}

int main()
{
	Test();
	return 0;
}