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

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 閱讀(514) 評論(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>
            亚洲国产欧美久久| 国产精品一区二区久久精品| 欧美国产日韩视频| 欧美亚洲一区二区三区| 午夜在线精品| 久久九九免费| 久久中文欧美| 欧美激情一区二区三区在线视频| 麻豆国产精品va在线观看不卡| 久久全球大尺度高清视频| 久久天堂国产精品| 美女诱惑一区| 亚洲精品一区久久久久久| 亚洲视频欧洲视频| 久久福利毛片| 欧美不卡视频一区| 欧美日韩一区二区在线视频 | 亚洲全部视频| 一区二区三区四区蜜桃| 亚洲欧美在线x视频| 欧美亚洲免费| 欧美激情按摩在线| 国产视频精品va久久久久久| 国内外成人在线| 亚洲精品免费看| 欧美一区二区三区视频| 久久午夜激情| 日韩视频免费观看高清完整版| 亚洲欧美国产日韩天堂区| 久久夜色精品国产欧美乱| 欧美日韩视频专区在线播放| 狠狠色综合网| 欧美亚洲日本国产| 亚洲电影免费观看高清完整版在线观看| 亚洲精品视频在线观看网站| 欧美一区二区三区在线观看| 欧美日韩伦理在线免费| 韩国三级电影久久久久久| av成人免费观看| 免费成人黄色| 香蕉免费一区二区三区在线观看| 麻豆精品网站| 国内精品久久久久影院优| 亚洲一区二区在线| 亚洲国产三级| 欧美大片网址| 亚洲大片av| 久久精品国产91精品亚洲| 亚洲毛片在线| 美女精品一区| 牛牛国产精品| 99re热精品| 狂野欧美一区| 亚洲一区二区三区中文字幕| 欧美精品久久久久久久免费观看 | 伊伊综合在线| 亚洲欧美国产视频| 亚洲欧洲精品一区二区三区不卡 | 欧美日韩国产综合新一区| 亚洲电影下载| 久久人人精品| 欧美一级淫片aaaaaaa视频| 欧美视频网址| 一区二区三区免费网站| 亚洲成人自拍视频| 麻豆av一区二区三区久久| 雨宫琴音一区二区在线| 久久精品国产99精品国产亚洲性色| 国产精品v欧美精品v日韩| 一二三区精品| 一区二区欧美视频| 国产精品久久久久久久浪潮网站| 亚洲一级二级| 亚洲一区二区三区四区视频| 国产精品久久久久久久久久免费| 亚洲欧美美女| 欧美一区二区福利在线| 国产手机视频一区二区| 久久精品一区二区国产| 久久都是精品| 亚洲国产一区二区在线| 欧美aa国产视频| 欧美精品九九99久久| 一区二区三区四区国产精品| 一本色道综合亚洲| 国产一区二区精品久久| 欧美h视频在线| 久久综合九色欧美综合狠狠| 亚洲福利视频专区| 一本久久综合亚洲鲁鲁| 国产亚洲高清视频| 免费h精品视频在线播放| 欧美激情亚洲综合一区| 亚洲欧美视频在线观看视频| 久久精品一区二区三区中文字幕 | 欧美亚洲视频在线观看| 久久国产一区| 国产精品久久久久国产精品日日| 校园春色综合网| 久久精品二区三区| 亚洲欧美日本国产有色| 欧美日韩一区二区三区高清| 在线亚洲一区| 亚洲欧美日韩一区二区三区在线观看| 国内激情久久| av不卡免费看| 在线看日韩欧美| 国产欧美日韩不卡| 欧美成人黄色小视频| 国产精品qvod| 欧美高清视频一区| 国产精品色婷婷| 欧美福利在线观看| 国产欧美日韩综合一区在线播放| 亚洲国产mv| 国产日韩综合| 日韩视频免费在线观看| 精品动漫3d一区二区三区免费版| 亚洲精品中文字幕在线观看| 韩日视频一区| 亚洲综合导航| 在线亚洲自拍| 美脚丝袜一区二区三区在线观看| 欧美亚洲一区在线| 欧美日韩亚洲91| 欧美激情影音先锋| 国产亚洲成年网址在线观看| 99精品视频免费| 亚洲精品乱码久久久久久黑人| 香蕉久久a毛片| 午夜亚洲影视| 国产精品久久久久久超碰| 亚洲国产日韩欧美在线99 | 亚洲欧洲精品一区二区三区| 狠狠综合久久av一区二区小说| 一区二区三区毛片| 一本色道久久综合亚洲91| 噜噜爱69成人精品| 免费视频一区| 黄色小说综合网站| 欧美在线一二三四区| 欧美在线播放一区| 国产日韩欧美一区二区三区四区| 亚洲自拍都市欧美小说| 欧美一区二区三区的| 国产精品私房写真福利视频| 宅男精品导航| 精品999成人| 久久久亚洲国产天美传媒修理工 | 一区二区视频免费完整版观看| 亚洲一级影院| 欧美一级在线视频| 国产精品手机视频| 欧美在线一级va免费观看| 久久青青草原一区二区| 亚洲夫妻自拍| 欧美日韩精品在线视频| 在线亚洲精品| 国产日韩欧美三区| 一区二区欧美在线| 欧美成人精品在线播放| 亚洲精品国产精品国自产观看| 一本色道久久88精品综合| 欧美日韩在线视频一区| 亚洲五月六月| 久久一区二区三区超碰国产精品| 精品二区视频| 欧美金8天国| av不卡在线观看| 久久精品一区二区三区四区| 亚洲国产精品va在线观看黑人 | 欧美日韩妖精视频| 午夜精品影院| 欧美黄色一区| 亚洲一区视频| 韩国视频理论视频久久| 欧美激情性爽国产精品17p| 在线午夜精品自拍| 美女在线一区二区| 亚洲一区在线看| 亚洲国产另类精品专区| 国产精品免费视频xxxx| 久久国产一区二区| 亚洲精品一区二区在线观看| 久久九九精品| 亚洲图片在区色| 在线观看91精品国产麻豆| 欧美日韩大片| 久久久一本精品99久久精品66| 日韩视频免费大全中文字幕| 久久精品在线| 亚洲在线视频网站| 亚洲精品美女在线| 狠狠色丁香婷婷综合| 国产精品久久久久9999吃药| 免费看成人av| 欧美在线黄色| 亚洲免费一区二区| 一本色道久久综合亚洲精品高清| 欧美国产极速在线|