C++標準ライブラリ---擬似関数


コンセプト
シミュレーション関数(functor)は、クラスの使用を関数のように見せることです.その実現はクラスの中でoperator()を実現し、このクラスは類似の関数の行為があり、模倣関数クラスである.
一部の機能のコードは、異なるメンバー関数で使用され、これらのコードを多重化したい場合があります.
1)共通の関数、はい、これは1つの解决方法ですが、関数が使ういくつかの変数は、共通のグローバル変数になる可能性があります.また、このようなコードを多重化するためには、1つの関数を立てるだけで、メンテナンスもよくありません.
2)関数を模倣し、単純なクラスを書き、クラスを維持するメンバー関数のほかにoperator()を実現するだけで、クラスがインスタンス化されると、使用するパラメータ以外の要素がクラスに転送されます.
一般的な関数を使用するには、次の手順に従います.
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>

using namespace std;

template<class T>
inline void PRINT_ELEMENTS(const T& coll,const char * optcstr="")
{
	typename T::const_iterator pos;
	cout<<optcstr;
	for(pos=coll.begin();pos!=coll.end();++pos)
	{
		cout<<*pos<<" ";
	}
	cout<<endl;
}

int square(int value)
{
	return value*value;
}

template<int theValue>
void add(int &elem)
{
	elem+=theValue;
}

int main()
{
	vector<int> coll1;
	vector<int> coll2;

	for(int i=1;i<=9;i++)
	{
		coll1.push_back(i);
	}
	PRINT_ELEMENTS(coll1,"initialized: ");

	for_each(coll1.begin(),coll1.end(),add<10>);

	PRINT_ELEMENTS(coll1,"after adding 10: ");

	transform(coll1.begin(),coll1.end(),back_inserter(coll2),square);

	PRINT_ELEMENTS(coll2,"squared: ");

	system("pause");
	return 0;
}

シミュレーション関数を使用するには、次の手順に従います.
//   
#include<iostream>
#include<list>
#include<algorithm>

using namespace std;

template<class T>
inline void PRINT_ELEMENTS(const T& coll,const char * optcstr="")
{
	typename T::const_iterator pos;
	cout<<optcstr;
	for(pos=coll.begin();pos!=coll.end();++pos)
	{
		cout<<*pos<<" ";
	}
	cout<<endl;
}

class AddValue
{
private:
	int theValue;
public:
	AddValue(int v):theValue(v) {}
	void operator()(int &elem) const
	{
		elem+=theValue;
	}
};

int main()
{
	list<int> coll;

	for(int i=1;i<=9;i++)
	{
		coll.push_back(i);
	}

	PRINT_ELEMENTS(coll,"initialized: ");

	for_each(coll.begin(),coll.end(),AddValue(10));

	PRINT_ELEMENTS(coll,"after adding 10: ");

	for_each(coll.begin(),coll.end(),AddValue(*coll.begin()));

	PRINT_ELEMENTS(coll,"after adding first element: ");

	system("pause");
	return 0;
}

行動が関数のようなものであれば、このオブジェクトは関数です.シミュレーション関数はこの意味ですが、STLではなぜ直接関数ではなくシミュレーション関数を使うのでしょうか.
まず、STLは独自のルールを持つフレームワークであり、関数ポインタはSTLの他のコンポーネント(アダプタ)と組み合わせることができず、より柔軟な変化を生み出します.
シミュレーション関数は、関数アダプタによって修飾され、互いに協力して全体を形成する能力があるべきである.シミュレーション関数をアタッチ可能にするには、独自の対応するカテゴリを定義する必要があります(反復器のカテゴリの役割は意味です).STLは1元と2元のシミュレーション関数のみを使用するため、2つのclass:unaru_を定義します.functionとbinary_function.この2つのクラスにはメンバーがなく、いくつかの型別定義しかありません.任意のシミュレーション関数は、個人のニーズに応じてclassの1つを継承することを選択すると、対応するカテゴリが自動的に所有され、アダプタ能力も自動的に所有されます.
次に、シミュレーション関数は、関数ポインタに対して独自の利点があります.
1、擬似関数は知能型関数である
スマートポインタの動作がポインタのように、ポインタと見なすことができます.しかし、スマートポインタは定義されたクラスオブジェクトであるため、ポインタ機能を備えながら他の能力もある.シミュレーション関数の能力はoperator()を超えることもできます.シミュレーション関数はメンバー関数とメンバー変数を持つことができるため、シミュレーション関数がステータスを持つことを意味します.もう1つの利点は、実行期間中に初期化できることです.
2、模関数はすべて自分の型别があります
これが汎用プログラミング作成シミュレーション関数です.
3、模関数は普通の関数より速い
templateの概念では、コンパイラでより詳細が決定されているため、通常、より良い最適化が可能である.