一般的なプログラミングは、テンプレートは、着信の種類に応じて異なるであろう比較的非効率的で、様々な例を生成します。
テンプレートプログラミング:
書式#include <iostreamの> 使用して名前空間はstdを、// 未使用函数包装器
テンプレート<型名T、型名F>
Tのuse_f(TはV、F、F)
{ 静的int型のカウント= 0 ;
カウント ++ ;
裁判所未満 << " use_f回数= " <<回数<< " :&カウント" <<&<<数えてendl;
リターンF(V);
} クラスFpの
{ プライベート:
ダブルZ_。
公共:
FP(ダブル Z = 1。
):Z_(Z){}
ダブル 演算子()(ダブル P){ 戻り Z_ * P;}
}。
クラス体F q
{
プライベート:
ダブルZ_。
公共:
体F q(二重 Z = 1.0 ):Z_(Z){}
ダブル 演算子()(ダブル P){ リターン Z_ + P;}
}。
ダブルダブ(ダブル X){ リターン 2.0 * X;}
二重四角(ダブル X){ リターン X *X;}
int型のmain(int型 ARGC、CHAR * ARGV [])
{
二重 Y = 1.2 。
裁判所未満 << " 関数ポインタダブ:" << てendl;
COUT << " - " << use_f(Y、DUB)。
裁判所未満 << " 平方関数ポインタ:" << てendl;
COUT << " - " << use_f(Y、四角)。
裁判所未満 << 「関数ポインタFP:endl;
COUT << " - " << use_f(Y、FP())。
裁判所未満 << " 関数ポインタ体F q:" << てendl;
COUT << " - " << use_f(Y、体F q())。
裁判所未満 << " 関数ポインタlambada1:" << てendl;
COUT << " - " << use_f(Y、[](二重 u)は{ 返す uは* Uを;});
coutの << "endl;
COUT << " - " << use_f(Y、[](ダブル U)を{ 戻り U + 2.5 ;});
リターン 0 ;
}
テンプレートプログラミングの利点は、アルゴリズム統一パッケージ高度に抽象的であるが、タイプのインスタンス化される特性に応じて、それらの非効率の原因となりました。
5つの関数のインスタンスを生成する静的なテンプレート関数、静的データのアドレスを表示することにより上記の結果、。巨大な増加発生符号量は、着信の種類に影響を与えました。
std ::関数テンプレートのインスタンス化によって削減するには:
#include <iostream>
#include <functional>
using namespace std;
//使用函数包装器
template <typename T,typename F>
T use_f(T v, F f)
{
static int count = 0;
count++;
cout<<"use_f count = "<<count<<": &count"<<&count<<endl;
return f(v);
}
class Fp
{
private:
double z_;
public:
Fp(double z = 1.0):z_(z){}
double operator ()(double p) {return z_*p;}
};
class Fq
{
private:
double z_;
public:
Fq(double z = 1.0):z_(z){}
double operator ()(double p) {return z_+p;}
};
double dub(double x){return 2.0*x;}
double square(double x){return x*x;}
int main(int argc, char *argv[])
{
double y = 1.2;
// cout<<"Function pointer dub:"<<endl;
// cout<<" --"<<use_f(y,dub);
// cout<<"Function pointer square:"<<endl;
// cout<<" --"<<use_f(y,square);
// cout<<"Function pointer Fp:"<<endl;
// cout<<" --"<<use_f(y,Fp());
// cout<<"Function pointer Fq:"<<endl;
// cout<<" --"<<use_f(y,Fq());
// cout<<"Function pointer lambada1:"<<endl;
// cout<<" --"<<use_f(y,[](double u){return u*u;});
// cout<<"Function pointer lambada2:"<<endl;
// cout<<" --"<<use_f(y,[](double u){return u+2.5;});
std::function<double(double)> fdub = dub;
std::function<double(double)> fsquare = square;
std::function<double(double)> fFp = Fp();
std::function<double(double)> fFq = Fq();
std::function<double(double)> lambada1 = [](double u){return u*u;};
std::function<double(double)> lambada2 = [](double u){return u+2.5;};
cout<<"Function pointer dub:"<<endl;
cout<<" --"<<use_f(y,fdub);
cout<<"Function pointer square:"<<endl;
cout<<" --"<<use_f(y,fsquare);
cout<<"Function pointer Fp:"<<endl;
cout<<" --"<<use_f(y,fFp);
cout<<"Function pointer Fq:"<<endl;
cout<<" --"<<use_f(y,fFq);
cout<<"Function pointer lambada1:"<<endl;
cout<<" --"<<use_f(y,lambada1);
cout<<"Function pointer lambada2:"<<endl;
cout<<" --"<<use_f(y,lambada2);
return 0;
}
所有的静态变量只有一个地址,也就是说模板 函数只产生了一个实例,其类型只需要匹配是一个std::function<double(double)>传入的对象即可,模板的效率大为提高。
但是看来好像代码量并未减少甚至还有些许增多,下面我们通过优化来解决这个问题。
熊掌与鱼:
#include <iostream>
#include <functional>
using namespace std;
//模板中使用函数包装器
template <typename T>
T use_f(T v, std::function<T(T)> f)
{
static int count = 0;
count++;
cout<<"use_f count = "<<count<<": &count"<<&count<<endl;
return f(v);
}
class Fp
{
private:
double z_;
public:
Fp(double z = 1.0):z_(z){}
double operator ()(double p) {return z_*p;}
};
class Fq
{
private:
double z_;
public:
Fq(double z = 1.0):z_(z){}
double operator ()(double p) {return z_+p;}
};
double dub(double x){return 2.0*x;}
double square(double x){return x*x;}
int main(int argc, char *argv[])
{
double y = 1.2;
//这里需要<double>使得std::function<T(T)>实例化为具体的对象
cout<<"Function pointer dub:"<<endl;
cout<<" --"<<use_f<double>(y,&dub);
cout<<"Function pointer square:"<<endl;
cout<<" --"<<use_f<double>(y,square);
cout<<"Function pointer Fp:"<<endl;
cout<<" --"<<use_f<double>(y,Fp());
cout<<"Function pointer Fq:"<<endl;
cout<<" --"<<use_f<double>(y,Fq());
cout<<"Function pointer lambada1:"<<endl;
cout<<" --"<<use_f<double>(y,[](double u){return u*u;});
cout<<"Function pointer lambada2:"<<endl;
cout<<" --"<<use_f<double>(y,[](double u){return u+2.5;});
return 0;
}
实例化与代码量都减少了,鱼和熊掌兼得。