九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C++調(diào)用lua函數(shù)的通用call,參數(shù)數(shù)目任意、參數(shù)類型任意

C++調(diào)用lua函數(shù)的通用call,參數(shù)數(shù)目任意、參數(shù)類型任意  

2012-10-23 13:07:53|  分類: C++ |  標簽:lua  bind  c++temlate  trait  參數(shù)   |字號 訂閱

我們只要用過一些成熟的lua對c++的綁定,例如SLB、luabind或者其他,就會想:為什么它們會這么神奇,可以在C++實現(xiàn)參數(shù)數(shù)目任意、參數(shù)類型任意的函數(shù)。現(xiàn)在我們來探討它們的本質(zhì),這里只討論它們的最初原型,當然現(xiàn)實的bind會非常復雜。

例如:實現(xiàn)調(diào)用lua函數(shù)的通用方法;

call("add",112, 2323.33); // 調(diào)用lua 的add方法,參數(shù)是一個整數(shù)和一個double

call("print","helloworld");// 調(diào)用lua 的 print 方法,參數(shù)是一個C-style 字符串"helloworld"

call("print",222222);// 調(diào)用lua 的 print 方法,參數(shù)是一個整數(shù)

將我們后面討論的方法稍稍修改下,也可以實現(xiàn)上面的神奇調(diào)用。

核心思想

對每種不同的參數(shù)類型 ,分別調(diào)用不同的處理函數(shù)Do()


//原型要首先聲明

template<typename T>

struct Trait

{

       static void Do(T t);  

};

//利用偏特化

template<>

struct Trait<int>

{

       static void Do(int t)

       {

              std::cout<<" Type int "<<t ;

       }

}; 

template<>

struct Trait<float>

{

       static void Do(float t)

       {

              std::cout<<"Type float "<<t ;

       }

};

 

template<>

struct Trait<double>

{

       static void Do(double t)

       {

              std::cout<<" Type double "<<t ;

       }

};

 

//char const *類型 無法從這里實例化,WHY

template<>

struct Trait<char*>

{

       static void Do(chart)

       {

              std::cout<<" Type char* "<<t ;

       } 

};

 

//奇怪的是 char *類型 無法從這里實例化 WHY

template<>

struct Trait<char const*>

{

       static void Do(char constt)

       {

              std::cout<<" Type char const* "<<t ;

       } 

};

 

template<>

struct Trait<std::string>

{

       static void Do(std::string t)

       {

              std::cout<<" Type std::string "<<t ;

       }

};

 


 關(guān)鍵的地方

template<typename T1typename T2>

void Call(T1 t1T2 t2)//自動推導

{   

      // 在函數(shù)內(nèi)部,T1、T2已經(jīng)被推導出來了,因此后面可以直接T1、T2來實例化其他的模版  

    //銜接前后    

       Trait<T1>::Do(t1);

       Trait<T2>::Do(t2);  

};


template<typename T1,typename T2,typename T3 ,typename T4>

void Call(T1 t1,T2 t2,T3 t3 ,T4 t4)

{  

       Trait<T1>::Do(t1);  

       Trait<T2>::Do(t2);  

       Trait<T3>::Do(t3);  

       Trait<T4>::Do(t4);      

};


實現(xiàn)的效果:

Call(11,1111);

Call("hello","world");

Call("HelloGuys");

Call(11, 22.2, 232.3f, std::string("fdsaf"));

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
編譯期檢查class是否有繼承關(guān)系
在你的游戲中應(yīng)用LUA
C++語言的15個晦澀特性
模板中的名字查找問題
c – 如何使這些std :: function參數(shù)明確無誤?
c++11模板的特化
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服