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

qiezi的學(xué)習(xí)園地

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

  C++博客 :: 首頁(yè) :: 新隨筆 ::  ::  :: 管理 ::

說(shuō)明:
要看懂后面那部分代碼,即使用Typelist的部分,最好預(yù)先看過(guò)《C++設(shè)計(jì)新思維》,英文版名為《Modern C++ Design》。
If模板類(lèi)在寫(xiě)完后想起來(lái)好像在哪見(jiàn)過(guò),早晨去公司查閱了一下,在《產(chǎn)生式編程——方法、工具與應(yīng)用》一書(shū)中有講,英文名為《Generative Programming -- Methods, Tools, and Applications》基本和本篇中一個(gè)樣。


前2篇亂七八糟地講了一些,有一個(gè)遺留問(wèn)題,函數(shù)原型的推導(dǎo)。

簡(jiǎn)要描述如下:

Method < void(in<int>in<char>, inout<string>out<short>> method;

// 同步調(diào)用
string str = "hello";
short value = 2;
method (
3'a', str, value);

// 異步調(diào)用1
method.async_call (3'a'"hello");

// 異步調(diào)用2
void test_func (intcharstringshort);
method.async_call (
3'a'"hello", test_func);


要產(chǎn)生這3種函數(shù)形式。參數(shù)類(lèi)型如何轉(zhuǎn)換,是以后的話(huà)題,本篇主要解決異步調(diào)用的函數(shù)原形推導(dǎo)問(wèn)題。本篇也不討論Method的模板參數(shù)(即那個(gè)函數(shù)類(lèi)型)返回類(lèi)型不為void的情況。

第一種形式,同步調(diào)用,比較好處理,參數(shù)個(gè)數(shù)和模板參數(shù)的數(shù)量相同。

后2種形式,如何讓編譯器根據(jù)in/out來(lái)推導(dǎo)出函數(shù)原型?

我們需要編譯器做這樣的處理,async_call的參數(shù)類(lèi)型中,in類(lèi)型的參數(shù)將保留,out類(lèi)型的參數(shù)不需要,inout類(lèi)型也需要保留。

要用到的Loki頭文件:

#include <static_check.h>
#include 
<Typelist.h>

using namespace Loki;
using namespace Loki::TL;


首先看看in/inout/out的聲明。為了簡(jiǎn)化,這里去掉了跟類(lèi)型推導(dǎo)無(wú)關(guān)的部分。

class NullType
{
    NullType ();
};

template 
<class T>
struct in
{
    typedef T OriginalType;
};

template 
<class T>
struct out
{
    typedef T OriginalType;
};

template 
<class T>
struct inout
{
    typedef T OriginalType;
};

下面Method模板類(lèi)的聲明,使用偏特化來(lái)產(chǎn)生代碼。為了簡(jiǎn)化,我只取函數(shù)參數(shù)個(gè)數(shù)為4個(gè)參數(shù)的版本,比照著上面的代碼來(lái)解釋?zhuān)唤忉宮ethod.async_call (3, 'a', "hello", test_func);這個(gè)版本,因?yàn)榱硪粋€(gè)比它簡(jiǎn)單。

template <class T>
struct Method
{
};

template 
<class Ret, class A, class B, class C, class D>
struct Method <Ret(A,B,C,D)> 
{
};


根據(jù)上面Method的定義,Method < void(in, in, inout, out) > ,async_call函數(shù)的類(lèi)型將是:

typedef void (*FUNC_TYPE)(intcharstringshort);
void async_call (intcharstring, FUNC_TYPE func);

實(shí)際上FUNC_TYPE應(yīng)該能夠接受更廣泛的類(lèi)型,比如void(int, char, char*, short),這可以在內(nèi)部做一些轉(zhuǎn)換,不過(guò)本篇的重點(diǎn)不在這里,所以只講上面的那種形式。

直接在Method類(lèi)中實(shí)現(xiàn)有些麻煩,所以我把這個(gè)函數(shù)放在一個(gè)基類(lèi)中實(shí)現(xiàn),只要編譯器能幫我們推導(dǎo)出下面這種形式就行了:

template <class Ret, class A, class B, class C, class D>
struct Method <Ret(A,B,C,D)> : public Base < A, B, C >
{
};


注意,這里是以Method < void(in, in, inout, out) >這種形式來(lái)講的,才會(huì)有上面那種繼承關(guān)系。而實(shí)際上,由于in/out在參數(shù)中的位置、數(shù)量都是未知的,要到定義時(shí)才能確定,所以使用模板來(lái)推導(dǎo)。(入正題了)

也就是說(shuō),只要我們能使用靜態(tài)推導(dǎo)方式,獲得A,B,C,D這四個(gè)參數(shù)中所有的in類(lèi)型,把它交給Base作為模板參數(shù)就成了。

這里需要一個(gè)輔助的模板類(lèi),用來(lái)在編譯時(shí)幫助推導(dǎo):

template <class T>
class InOutTypeTraits
{
    Loki::CompileTimeError 
<false> Not_Supported_Type;
};

template 
<class T>
struct InOutTypeTraits < in<T> >
{
    
enum {isin=1, isout=0};
};

template 
<class T>
struct InOutTypeTraits < out<T> >
{
    
enum {isin=0, isout=1};
};

template 
<class T>
struct InOutTypeTraits < inout<T> >
{
    
enum {isin=1, isout=1};
};

template 
<>
struct InOutTypeTraits < NullType >
{
    
enum {isin=0, isout=0};
};

通過(guò)另一個(gè)模板類(lèi)InList來(lái)幫我們產(chǎn)生所有的in類(lèi)型,它的結(jié)果是一個(gè)Typelist。為了方便以后使用,我把out類(lèi)型產(chǎn)生器也做了一個(gè)OutList。

template <int CONDITION, class _IF, class _ELSE>
struct If
{
    typedef _IF Result;
};

template 
<class _IF, class _ELSE>
struct If <0, _IF, _ELSE>
{
    typedef _ELSE Result;
};

template 
<class A = NullType, class B = NullType, class C = NullType, class D = NullType, 
    
class E = NullType, class F = NullType, class G = NullType, class H = NullType
>
struct InList
{
    typedef typename If 
< 
        InOutTypeTraits 
<A>::isin,
        typename Typelist 
< A, typename InList<B,C,D,E,F,G>::Result >
        typename InList
<B,C,D,E,F,G,H>::Result 
    
>::Result Result;
};

template 
<class A>
struct InList <A, NullType, NullType, NullType, NullType, NullType, NullType, NullType>
{
    typedef typename If 
<
        InOutTypeTraits 
<A>::isin,
        typename MakeTypelist 
<A>::Result,
        typename MakeTypelist 
<>::Result
    
>::Result Result;
};

template 
<class A = NullType, class B = NullType, class C = NullType, class D = NullType, 
    
class E = NullType, class F = NullType, class G = NullType, class H = NullType
>
struct OutList
{
    typedef typename If 
< 
        InOutTypeTraits
<A>::isout,
        typename Typelist 
< A, typename OutList<B,C,D,E,F,G>::Result >
        typename OutList
<B,C,D,E,F,G,H>::Result 
    
>::Result Result;
};

template 
<class A>
struct OutList <A, NullType, NullType, NullType, NullType, NullType, NullType, NullType>
{
    typedef typename MakeTypelist 
<A>::Result Result;
};

它的原理是,根據(jù)If模板類(lèi)來(lái)判斷一個(gè)類(lèi)型是不是in類(lèi)型,是的話(huà)就把它加入到Typelist中,不是就排除它。

InList , in, inout, out::Result是一個(gè)Typelist , Typelist, Typelist, NullType> > >類(lèi)型,說(shuō)簡(jiǎn)單點(diǎn),它和MakeTypelist < in, in, inout >::Result是等價(jià)的。

現(xiàn)在Base模板類(lèi)將接受一個(gè)模板參數(shù),它是一個(gè)Typelist類(lèi)型,這個(gè)不詳細(xì)講了,把它的定義寫(xiě)出來(lái):

template <class T, int T_COUNT = Length <IN_TYPE>::value >
struct Base
{
    Loki::CompileTimeError 
<false> Only_Use_Partial_Specialisation_Version;
};

template 
<class T>
struct Base <T, 0>
{
    typedef 
void(*FUNC_TYPE)();

    template 
<class FUNC_TYPE>
    
void async_call (FUNC_TYPE func)
    {
    }
    
void async_call ()
    {
    }
};

template 
<class T>
struct Base <T, 1>
{
    typedef 
void(*FUNC_TYPE)(
        typename TypeAt 
<T, 0>::Result::OriginalType);

    
void async_call (
        typename TypeAt 
<T, 0>::Result::OriginalType v0,
        FUNC_TYPE func)
    {
    }
    
void async_call (typename TypeAt <T, 0>::Result::OriginalType v0)
    {
    }
};

template 
<class T>
struct Base <T, 2>
{
    typedef 
void(*FUNC_TYPE)(
        typename TypeAt 
<T, 0>::Result::OriginalType,
        typename TypeAt 
<T, 1>::Result::OriginalType);

    
void async_call (
        typename TypeAt 
<T, 0>::Result::OriginalType v0, 
        typename TypeAt 
<T, 1>::Result::OriginalType v1, 
        FUNC_TYPE func)
    {
    }
    
void async_call (
        typename TypeAt 
<T, 0>::Result::OriginalType v0, 
        typename TypeAt 
<T, 1>::Result::OriginalType v1)
    {
    }
};

template 
<class T>
struct Base <T, 3>
{
    typedef 
void(*FUNC_TYPE)(
        typename TypeAt 
<T, 0>::Result::OriginalType, 
        typename TypeAt 
<T, 1>::Result::OriginalType,
        typename TypeAt 
<T, 2>::Result::OriginalType);

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

template 
<class T>
struct Base <T, 4>
{
    typedef 
void(*FUNC_TYPE)(
        typename TypeAt 
<T, 0>::Result::OriginalType, 
        typename TypeAt 
<T, 1>::Result::OriginalType,
        typename TypeAt 
<T, 2>::Result::OriginalType,
        typename TypeAt 
<T, 3>::Result::OriginalType);

    
void async_call (
        typename TypeAt 
<T, 0>::Result::OriginalType v0, 
        typename TypeAt 
<T, 1>::Result::OriginalType v1, 
        typename TypeAt 
<T, 2>::Result::OriginalType v2, 
        typename TypeAt 
<T, 3>::Result::OriginalType v3,
        FUNC_TYPE func)
    {
    }
    
void async_call (
        typename TypeAt 
<T, 0>::Result::OriginalType v0,
        typename TypeAt 
<T, 1>::Result::OriginalType v1,
        typename TypeAt 
<T, 2>::Result::OriginalType v2,
        typename TypeAt 
<T, 3>::Result::OriginalType v3)
    {
    }
};

這部分有點(diǎn)多,其實(shí)還是比較清晰的。注意這個(gè)Base的版本已經(jīng)不是上面所講的那個(gè)了。

函數(shù)原形推導(dǎo)問(wèn)題就講完了。上面的代碼不一定還能編譯,昨天是能編譯的,被我修改了一些,為了解釋?zhuān)指某勺蛱炷菢幼印?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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在线观看| 国产日韩欧美一区| 欧美在线观看视频在线 | 亚洲人成艺术| 国产日韩精品在线播放| 欧美日韩国产综合视频在线| 久久亚洲精品一区二区| 午夜精品久久久久影视| 日韩亚洲欧美在线观看| 亚洲大胆av| 久久亚洲不卡| 久久精品国产一区二区三| 亚洲性视频h| 一级成人国产| 99国产精品国产精品久久| 尤物视频一区二区| 狠狠色综合网| 国产中文一区二区| 国产日韩欧美91| 国产美女扒开尿口久久久| 欧美视频官网| 欧美日韩激情网| 欧美精品一区二区蜜臀亚洲| 老司机精品福利视频| 久久福利毛片| 久久狠狠亚洲综合| 欧美中文在线免费| 欧美自拍偷拍| 久久精品二区亚洲w码| 久久不射网站| 久久久久久久网| 另类人畜视频在线| 欧美sm极限捆绑bd| 欧美激情亚洲精品| 欧美日韩国产系列| 欧美视频一区二区| 国产精品婷婷| 国产一区二区三区久久悠悠色av | 久久精品国产一区二区三区| 欧美一区二区久久久| 欧美一区二区免费观在线| 欧美一级大片在线观看| 欧美伊人久久| 久久这里有精品15一区二区三区 | 亚洲视频免费在线观看| 中日韩美女免费视频网址在线观看| 一区二区av在线| 午夜欧美大片免费观看| 久久精品国产v日韩v亚洲| 久久婷婷综合激情| 牛人盗摄一区二区三区视频| 欧美黄免费看| 国产精品国产三级国产a| 国产日韩精品一区二区三区| 在线播放日韩欧美| 日韩亚洲国产欧美| 亚洲欧洲av一区二区| 久久精品日韩| 亚洲国产精品免费| 在线视频你懂得一区| 久久aⅴ国产欧美74aaa| 欧美a级一区| 国产精品久久久久免费a∨大胸| 国产日韩欧美成人| 亚洲欧洲免费视频| 亚洲欧美视频在线观看视频| 久久午夜色播影院免费高清| 亚洲丁香婷深爱综合| 在线一区观看| 久久综合久久综合九色| 欧美丝袜一区二区三区| 国产综合久久| 亚洲视频一二| 另类尿喷潮videofree| 日韩一区二区高清| 久久久99免费视频| 国产精品白丝av嫩草影院| 激情成人亚洲| 亚洲综合欧美| 欧美激情aaaa| 亚洲欧洲av一区二区| 欧美成人精品在线播放| 国产亚洲精品美女| 中文无字幕一区二区三区| 久久久综合网| 一区二区欧美国产| 欧美99久久| 国内精品久久久久久久影视蜜臀| aa日韩免费精品视频一| 老司机免费视频久久| 一本大道久久a久久精二百| 久久久久网站| 国产日韩欧美一区二区三区在线观看| 亚洲精品免费网站| 久久免费视频在线| 中日韩高清电影网| 欧美精品一区三区| 在线精品视频一区二区| 欧美诱惑福利视频| 中文亚洲字幕| 欧美日韩一区二区三区四区五区 | 亚洲视频 欧洲视频| 裸体歌舞表演一区二区| 亚洲欧美一区二区激情| 欧美日韩一卡二卡| 亚洲日本无吗高清不卡| 乱中年女人伦av一区二区| 亚洲专区免费| 欧美午夜精品久久久久久超碰| 亚洲清纯自拍| 欧美大学生性色视频| 久久se精品一区二区| 国产麻豆精品在线观看| 亚洲欧美日韩精品久久久久| 日韩亚洲成人av在线| 欧美激情精品| 亚洲国产日韩欧美综合久久| 麻豆久久精品| 久久久噜噜噜| 经典三级久久| 狂野欧美激情性xxxx| 欧美在线观看一区二区| 国产视频在线观看一区二区三区| 西西裸体人体做爰大胆久久久| 99精品国产热久久91蜜凸| 欧美精品综合| 亚洲午夜精品福利| 在线一区免费观看| 国产精品试看| 久久成人资源| 欧美在线中文字幕| 尤物yw午夜国产精品视频明星| 噜噜爱69成人精品| 老司机一区二区| 亚洲精品日韩在线观看| 亚洲国产一区二区视频| 欧美精品激情在线观看| 一本一道久久综合狠狠老精东影业| 亚洲三级电影全部在线观看高清| 欧美日本免费| 午夜国产精品视频| 欧美一级日韩一级| 尤物九九久久国产精品的特点| 欧美国产另类| 欧美美女喷水视频| 午夜欧美不卡精品aaaaa| 欧美一区二区国产| 亚洲福利视频专区| 亚洲欧洲精品一区二区三区不卡| 欧美日韩123| 欧美一区二区视频观看视频| 久久不见久久见免费视频1| 亚洲高清在线观看| 亚洲精品综合久久中文字幕| 欧美亚州韩日在线看免费版国语版| 欧美一区二区日韩一区二区| 久久精品视频一| 日韩亚洲欧美在线观看| 亚洲视频香蕉人妖| 激情懂色av一区av二区av| 亚洲电影欧美电影有声小说| 欧美日韩在线观看视频| 久久精品一区二区三区不卡牛牛| 久久嫩草精品久久久久| 一区二区欧美日韩视频| 亚洲欧美日韩一区二区三区在线观看 | 日韩一本二本av| 国产精品99久久99久久久二8 | 国产精品日韩在线| 久久永久免费| 欧美三级特黄| 美女黄网久久| 欧美性大战久久久久久久| 久久资源在线| 国产精品成人一区二区网站软件 | 久久亚洲一区二区| 亚洲一区二区三区午夜| 久久精品人人做人人爽| 一区二区三区国产在线| 久久久国产精彩视频美女艺术照福利| aa级大片欧美| 久久久久久亚洲精品杨幂换脸| 亚洲午夜av在线| 久久亚洲风情| 久久不见久久见免费视频1| 欧美激情免费在线| 久久这里只有| 国产精品素人视频| 亚洲精品久久7777| 一色屋精品视频在线观看网站| 亚洲天堂男人| 日韩午夜激情电影| 久久久噜噜噜久久久| 欧美一区二区三区啪啪| 欧美日本国产精品| 欧美激情一区二区三区成人| 国产亚洲福利一区| 亚洲伊人观看| 亚洲免费视频在线观看| 欧美精品 日韩|