青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

qiezi的學習園地

AS/C/C++/D/Java/JS/Python/Ruby

  C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
如《為C++實現一個IDL(三)》一文中所說,還剩最后一個問題,還是使用前面的測試代碼說明。

async_call函數的原型是:

typedef void(*FUNC_TYPE)(intcharstringshort);

void async_call (int v0, char v1, string v2, FUNC_TYPE func);

這是模板類根據in/out來產生的。

在異步調用中,參數是和操作保存在一起的,因為要交給線程處理。前面已經說過,Method模板類中將保有這些參數,Method的定義如下(以例子中4個參數的特化版本來說明):

template <class A, class B, class C, class D>
struct Method <void(A,B,C,D)> : public Base < typename Loki::TL::MakeTypelist< A,B,C,D >::Result >
{
    A a;
    B b;
    C c;
    D d;
    Method ()
    {
        parameters.push_back (
&a);
        parameters.push_back (
&b);
        parameters.push_back (
&c);
        parameters.push_back (
&d);
    }
};

相應地,Base類使用這個特化版本:

template <class TYPES, class IN_TYPES>
struct Base <TYPES, IN_TYPES, 3> : public IMethod
{
    typedef typename FuncTypeTraits 
<TYPES>::Result FUNC_TYPE;

    
void async_call (
        typename Loki::TL::TypeAt 
<IN_TYPES, 0>::Result::OriginalType v0, 
        typename Loki::TL::TypeAt 
<IN_TYPES, 1>::Result::OriginalType v1, 
        typename Loki::TL::TypeAt 
<IN_TYPES, 2>::Result::OriginalType v2, 
        FUNC_TYPE func 
= 0)
    {
    }
};

TYPES模板參數中保存了所有的參數類型,IN_TYPES模板參數中保存了所有的in參數類型,但它們不知道如何來對應起來,async_call也不知道如何把幾個參數值交給parameters(在IMethod中定義,見上一篇)。

如果我們在生成IN_TYPES的時候,把它在TYPES中的位置(索引)也一起交給它,就能解決這個問題。

InList第二個模板參數是一個常量,當我們把TYPES交給它時,以上面的代碼為例,將會使用T_COUNT值為4的偏特化版本。這時候,將會首先推導出IN_TYPES中的第一個類型int,它在IN_TYPES中的索引是0,并接著調用T_COUNT值是3的偏特化版本,這樣遞歸推導,直到調用T_COUNT值為0的偏特化版本,這個過程就結束了。在這個遞歸過程中,能夠得到各個類型以及對應的“索引”值:int: 4, char: 3, string: 2。

注意這個索引值和實際的索引值是有差別的,實際的索引值應該是4-T_COUNT,所以上面的對應關系應該是:int: 0, char: 1, string: 2。

最初傳遞給InList的TYPES有4個元素,當它遞歸調用時,這個值就會依次遞減,后面的遞歸調用并不知道應該用4去減掉T_COUNT作為索引,因為4并沒有傳遞過來。簡單的解決辦法是再加上一個模板參數,讓它往下傳遞,當然這種方式并不好看,好在我們不是真的必須這么做。

注意,在Base類中,它是知道TYPES的個數的,那么只要用這個數減去前面生成的IN_TYPE的“索引”,就能得到這個類型在TYPES中的真正索引。(這部分真是有點羅嗦)

修改InList模板類,讓它生成由 [ in類型以及in類型在TYPES中的“索引”] 構成的新Typelist。

首先要增加一個輔助模板類:

template <class T, int INDEX>
struct TypeReversedIndex
{
    typedef T type;
    
enum {value = INDEX};
};

它能夠保存一個類型,以及一個整數。取名為TypeReversedIndex,意思是說它要保存一個Type和一個ReversedIndex(反的索引)。

InList模板類也要修改,OutList依舊是免費贈送:

template < class T, int T_COUNT = Loki::TL::Length <T>::value >
struct InList
{
    typedef typename If 
<
        InOutTypeTraits 
<typename T::Head>::isin,
        typename Loki::Typelist 
< TypeReversedIndex <typename T::Head, T_COUNT>, typename InList <typename T::Tail>::Result >
        typename InList 
<typename T::Tail>::Result
    
>::Result Result;
};


template 
<class T>
struct InList < T, 0 >
{
    typedef typename Loki::TL::MakeTypelist 
<>::Result Result;
};

template 
< class T, int T_COUNT = Loki::TL::Length <T>::value >
struct OutList
{
    typedef typename If 
<
        InOutTypeTraits 
<typename T::Head>::isout,
        typename Loki::Typelist 
< TypeReversedIndex <typename T::Head, T_COUNT>, typename OutList <typename T::Tail>::Result >
        typename OutList 
<typename T::Tail>::Result
    
>::Result Result;
};


template 
<class T>
struct OutList < T, 0 >
{
    typedef typename Loki::TL::MakeTypelist 
<>::Result Result;
};

Base類就可以寫出來了:

template <class TYPES, class IN_TYPES>
struct Base <TYPES, IN_TYPES, 3> : public IMethod
{
    typedef typename FuncTypeTraits 
<TYPES>::Result FUNC_TYPE;
    typedef IN_TYPES type;

    
enum {TYPES_COUNT = typename Loki::TL::Length<TYPES>::value};

    
void async_call (
        typename Loki::TL::TypeAt 
<IN_TYPES, 0>::Result::type::OriginalType v0, 
        typename Loki::TL::TypeAt 
<IN_TYPES, 1>::Result::type::OriginalType v1, 
        typename Loki::TL::TypeAt 
<IN_TYPES, 2>::Result::type::OriginalType v2, 
        FUNC_TYPE func 
= 0)
    {
        ((typename Loki::TL::TypeAt 
<IN_TYPES, 0>::Result::type*)
            parameters[TYPES_COUNT 
- typename Loki::TL::TypeAt <IN_TYPES, 0>::Result::value])->setValue (v0);
        ((typename Loki::TL::TypeAt 
<IN_TYPES, 1>::Result::type*)
            parameters[TYPES_COUNT 
- typename Loki::TL::TypeAt <IN_TYPES, 1>::Result::value])->setValue (v1);
        ((typename Loki::TL::TypeAt 
<IN_TYPES, 2>::Result::type*)
            parameters[TYPES_COUNT 
- typename Loki::TL::TypeAt <IN_TYPES, 2>::Result::value])->setValue (v2);
    }
};

parameters中存放的是IParameter*類型,這里使用了強制轉型,并調用in/inout模板類的setValue方法給它賦值。

為了測試結果,我為IParameter加上了void print () const虛函數,并在in/inout/out模板類中實現它,打印出類型,in/inout類中還將打印出參數值。

class IParameter
{
public:
    
virtual void print () const = 0;
};

template <class T>
struct in : public IParameter
{
    typedef T OriginalType;
    T value;
    
void setValue (T v){
        value 
= v;
    }
    
void print () const { 
        cout 
<< typeid(*this).name() << "" << value << endl; 
    }
};

template 
<class T>
struct out : public IParameter
{
    typedef T OriginalType;
    
virtual void print () const {
        cout 
<< typeid(*this).name() << endl; 
    }
};

template 
<class T>
struct inout : public IParameter
{
    typedef T OriginalType;
    T value;
    
void setValue (T v){
        value 
= v;
    }
    
virtual void print () const {
        cout 
<< typeid(*this).name() << "" << value << endl; 
    }
};

并在Base::async_call中調用parameters中所有對象的print函數來輸出一些調試信息:

for (size_t i = 0; i < parameters.size(); i ++)
    parameters[i]
->print ();

簡單測試了2種類型,不能保證所有代碼都是正確的,畢竟是手工寫出來的也沒經過檢查,模板類在沒有實例化的時候某些錯誤是不會報告的。

測試代碼如下:

void test_func (int v0, char v1, string v2, short v3)
{
    cout 
<< "===========================================" << endl;
    cout 
<< "test_func(" << v0 << "" << v1 << "" << v2 << "" << v3 << ")" << endl;
}

void test_func1 (int v0, char v1, short v2, string v3)
{
    cout 
<< "===========================================" << endl;
    cout 
<< "test_func1(" << v0 << "" << v1 << "" << v2 << "" << v3 << ")" << endl;
}

int main()
{
    {
        Method 
< void(in<int>in<char>, inout<string>out<short>> m;

        m.async_call(
3'a'"test");
        cout 
<< "===========================================" << endl;
        m.async_call(
3'a'"test", test_func);
        cout 
<< "===========================================" << endl;
    }

    {
        Method 
<string(in<int>out<char>, inout<short>)> m;
        m.async_call(
34);
        cout 
<< "===========================================" << endl;
        m.async_call(
34, test_func1);
        cout 
<< "===========================================" << endl;
    }

    
return 0;
}

全部代碼太長,就不一一羅列于此了,可以點擊這里下載。
posted on 2005-09-22 19:13 qiezi 閱讀(515) 評論(7)  編輯 收藏 引用 所屬分類: C++asgard項目
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            精品av久久707| 久久久久亚洲综合| 久久婷婷蜜乳一本欲蜜臀| 亚洲综合丁香| 欧美精品导航| 男女激情视频一区| 国产偷自视频区视频一区二区| 亚洲激情午夜| 亚洲电影av在线| 欧美主播一区二区三区美女 久久精品人 | 性欧美8khd高清极品| 久久亚洲欧洲| 欧美亚洲免费在线| 国产一区日韩二区欧美三区| 一区二区免费在线观看| 欧美一区二区私人影院日本| 欧美精品一区在线发布| 久久综合免费视频影院| 亚洲男人的天堂在线观看| 午夜精品久久99蜜桃的功能介绍| 日韩视频免费| 欧美黑人在线播放| 免费一级欧美在线大片| 老牛影视一区二区三区| 久久一区二区视频| 日韩亚洲国产精品| 亚洲三级国产| 亚洲免费小视频| 日韩视频免费在线观看| 亚洲精品美女久久7777777| 亚洲专区欧美专区| 一区二区三区鲁丝不卡| 欧美日韩精品免费观看视一区二区 | 99精品视频免费观看视频| 中文网丁香综合网| 亚洲日本欧美天堂| 亚洲香蕉网站| 欧美日本一区| aa亚洲婷婷| 欧美一激情一区二区三区| 久久久久久97三级| 欧美新色视频| 亚洲一区精品在线| 国产精品日韩精品| 日韩亚洲欧美一区二区三区| 欧美在线资源| 欧美一区二区在线看| 欧美在线一二三区| 亚洲一二三区在线| 欧美精品二区三区四区免费看视频| 欧美三区在线视频| 日韩视频不卡| 农村妇女精品| 国产在线视频不卡二| 久久久久免费| 夜夜嗨av一区二区三区四季av| 欧美精品一区二区在线观看 | 久久久99精品免费观看不卡| 亚洲一本视频| 国产酒店精品激情| 久久www成人_看片免费不卡| 性欧美18~19sex高清播放| 亚洲免费视频成人| 国产日韩欧美在线视频观看| 久久久久91| 久久av资源网站| 亚洲国产综合视频在线观看| 99视频一区| 久久久久99| 亚洲夜晚福利在线观看| 在线亚洲免费| 一本久久a久久免费精品不卡| 一本一道久久综合狠狠老精东影业 | 亚洲国产精品黑人久久久| 亚洲人成人一区二区三区| 久久综合九色综合网站| 亚洲国产婷婷综合在线精品| 亚洲一区二区3| 99xxxx成人网| 久久久久青草大香线综合精品| 夜夜嗨av一区二区三区网站四季av| 亚洲大胆美女视频| 欧美日韩国产在线| 亚洲人成网站色ww在线| 国产精品久久久久婷婷| 亚洲欧洲一区二区三区| 亚洲经典三级| 欧美激情第3页| 久久成人18免费观看| 欧美日韩伦理在线免费| 亚洲高清资源| 日韩午夜精品视频| 欧美成ee人免费视频| 亚洲精品国产品国语在线app| 欧美激情第4页| 欧美黄色一区| 99视频精品免费观看| 欧美激情一区| 日韩视频一区二区| 亚洲一区3d动漫同人无遮挡| 宅男66日本亚洲欧美视频| 亚洲欧美日韩久久精品| 国产欧美在线播放| 欧美高清在线一区二区| 亚洲图片激情小说| 久久久久久久一区二区| 国产麻豆9l精品三级站| 久久免费精品视频| 欧美一级理论性理论a| 亚洲国产精品久久久久秋霞影院| 亚洲国产综合在线| 另类专区欧美制服同性| 亚洲欧美日韩在线| 日韩视频在线观看国产| 久久亚洲二区| 亚洲欧洲偷拍精品| 国产欧美在线播放| 欧美日韩免费一区二区三区| 亚洲欧美成人网| 午夜精品一区二区三区四区| 欧美淫片网站| 亚洲国产日韩一区| 最新国产乱人伦偷精品免费网站 | 国产在线成人| 国产日韩欧美精品一区| 国内精品视频一区| 亚洲高清不卡在线| 亚洲精品专区| 9久草视频在线视频精品| 亚洲一区国产一区| 久久久国产一区二区| 久久综合一区二区| 亚洲国产婷婷综合在线精品 | 国产精品高清在线| 国产午夜精品视频| 亚洲国产精品久久久久婷婷老年| 亚洲精品少妇网址| 欧美亚洲在线视频| 欧美α欧美αv大片| 亚洲精品日韩在线| 欧美一区二区在线免费观看| 美日韩精品视频免费看| 国产精品久久久久久久久果冻传媒 | 99综合精品| 午夜精品久久久久久久99樱桃| 久久久久国产精品麻豆ai换脸| 欧美精品亚洲一区二区在线播放| 国产精品每日更新| 亚洲激情欧美| 欧美一区二区视频在线| 亚洲二区视频| 午夜精品久久久久久久99樱桃 | 久久亚洲精品中文字幕冲田杏梨 | 亚洲电影一级黄| 亚洲一区二区黄| 免费亚洲电影在线| 亚洲一区二区三区四区视频| 蜜臀av在线播放一区二区三区| 国产精品免费看片| 亚洲精品久久久久久久久| 久久成人久久爱| 一区二区91| 免费中文字幕日韩欧美| 国产亚洲人成网站在线观看| 亚洲深夜福利在线| 亚洲第一福利视频| 久久久www成人免费毛片麻豆| 国产精品久久国产三级国电话系列| 亚洲国产成人av在线| 欧美一区二区三区另类| 9人人澡人人爽人人精品| 欧美www视频| 1024精品一区二区三区| 久久久久久久91| 亚洲在线免费观看| 国产精品xxxxx| 一区二区欧美精品| 最新69国产成人精品视频免费| 久久精品九九| 国产一区视频在线看| 欧美在线视频不卡| 亚洲午夜精品久久久久久app| 欧美日韩日本国产亚洲在线| 日韩午夜中文字幕| 亚洲国产精品第一区二区三区| 久久久亚洲精品一区二区三区| 国内视频一区| 久久综合狠狠综合久久激情| 欧美中文日韩| 国内精品亚洲| 免费观看成人www动漫视频| 久久九九国产精品| 1024国产精品| 欧美激情亚洲| 欧美日韩大片| 一区二区三区 在线观看视频| 日韩午夜激情电影| 欧美日韩中文| 欧美一区在线看| 久久激五月天综合精品|