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;
};
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;
}
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;
};
class Widget
...{
public:
void fun()
...{
cout<<"I am normal fun"<<endl;
}
protected:
T _fdata;
U _sdate;
};
这允许使用者可以不指定参数使用我们的类:
Widget<> hdhd;
hdhd.fun();
hdhd.fun();
但是你无法提供多笔默认,这是肯定的,要不然使用者不提供类型的时候编译器依照哪个推导呢。
顺便提一下,type2type,int2type可以允许你依照类型定制特定函数。
- Template带来曙光(1.4)
- Google自动识别专利将给视频行业带来新曙光!
- 易优品“颠覆网购新体验”为电商导购带来新曙光
- Generic design | 多重继承在设计组合上的失败以及Templates带来的曙光
- OpenAI 提出层级强化学习,给长序列动作学习带来新的曙光
- 高曙光
- 曙光初现
- template
- Template
- template
- template
- template
- Template
- template
- template
- Template
- template
- Template
- Java咖啡馆(9)——一个压缩归档实用软件
- Java咖啡馆(10):情人节的Applet
- .net程序员的盲点(七):转换关键字:operator、explicit与implicit
- Java咖啡馆(11):Java插件技术
- Java咖啡馆(12): 终结者
- Template带来曙光(1.4)
- ADO CreateParameter 方法
- 什么时候需要重建索引
- 设计模式解析笔记----Bridge
- 获取本机名
- 两个程序看指针
- linux 启动全接触
- 在C#程序中使用系统热键
- Java与XML读写之DOM篇