Template带来曙光(1.4)

来源:互联网 发布:java实现三个人打球 编辑:程序博客网 时间:2024/04/28 16:09

使用Template的时候:

1.你无法特例化结构。单单使用template,你无法特例化“class的结构”(我的意思是其数据成员),你只能特例化其成员函数。

2.成员函数的特例化不能“依理扩张”。你可以对“单一template参数”的class template特例化其成员函数,却无法对“多个template参数”的class template特例化其个别成员函数。

3.程序库撰写者不能提供多笔缺省值。

a特例化类:

看了以上第1第2,你可能会有这样的代码:

template    <class T,class U>
class    Widget
{
public:
    
void    fun()
    
{
        cout
<<"I am normal fun"<<endl;
    }

protected:
    T        _fdata;
    U        _sdate;
}
;

template    
<>
class    Widget<char,int>
{
public:
    
void    fun()
    
{
        cout
<<"I am char-int fun"<<endl;
    }

protected:
    
char    _fdata;
    
int        _sdata;
}
;
template    
<class U>
class    Widget<float,U>
{
public:
    
void    fun()
    
{
        cout
<<"I am float-unknown fun"<<endl;
    }

protected:
    
float    _fdata;
    U        _sdata;
}
;

是的,这样看起来好极了,但是,请区分开来,这样做你是在特例化类,你从来也没有对成员函数和属性特例化。特例化是一种手段,允许你在这个时候就定制,如果以后编译器遇到符合条件的情况,直接用你现在指定的行为,而不再用模板推导。

为了达到特例化成员函数的目的,你可以这样:
b.特例化成员函数

template    <class T,class U>
class    Widget
{
public:
    
void    fun()
    
{
        cout
<<"I am normal fun"<<endl;
    }

protected:
    T        _fdata;
    U        _sdate;
}
;
template    
<>
void    Widget<char,int>::fun()
{
    cout
<<"I am char-int fun"<<endl;
}


template    
<class U>
void    Widget<float,U>::fun()
{
    cout
<<"I am float-unknown fun"<<endl;
}

是的,你这样才是特例化里方法,你指定在遇到特定参数的时候使用特定的方法行为,你的编译器会告诉你说这里好像有点问题,验证了第2点。

c.特例化成员变量
如果你想特例化成员变量,sorry,目前为止我还无法给你提供一个即使错误的代码,我实在无法想起来如何构造一个不同参数的时候我定义成员变量的方式,即使是静态变量。那让我们相信第1点吧。

d.提供默认值
在最初的代码上,我们可以这样:

template    <class T = double,class U = double>
class    Widget
{
public:
    
void    fun()
    
{
        cout
<<"I am normal fun"<<endl;
    }

protected:
    T        _fdata;
    U        _sdate;
}
;


这允许使用者可以不指定参数使用我们的类:

    Widget<>    hdhd;
    hdhd.fun();

但是你无法提供多笔默认,这是肯定的,要不然使用者不提供类型的时候编译器依照哪个推导呢。

顺便提一下,type2type,int2type可以允许你依照类型定制特定函数。

原创粉丝点击