テンプレートの非効率性を向上させるためにはstd ::機能を使います

一般的なプログラミングは、テンプレートは、着信の種類に応じて異なるであろう比較的非効率的で、様々な例を生成します。

テンプレートプログラミング:

書式#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;
}

 

 

 实例化与代码量都减少了,鱼和熊掌兼得。

 

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/wangkeqin/p/11946255.html