用协变模板参数进行矢量对象操作

ZDNet软件频道 时间:2003-07-16 作者:ZDNet China |  我要评论()
本文关键词:cpptips
假设你需要定义一个参数类型为矢量对象、并对该矢量对象进行一定操作的函数,那么该函数必须是类属的(generic),也就是说它应该以同样的方式处理所有的std::vector实例。
本文译自Builder.com,未经许可请勿转载假设你需要定义一个参数类型为矢量对象、并对该矢量对象进行一定操作的函数,那么该函数必须是类属的(generic),也就是说它应该以同样的方式处理所有的std::vector<T>实例。

然而,由于矢量本身并不是一个完整的类型,你需要确保该函数可以处理各种特定的矢量,如vector<char>、vector<Widget>等等。实现这一目标的最好方法就是把函数定义为一个模板,其参数随着矢量参数T的不同而变化(即协变的)。

在下面的例子中,insert_one()函数模板插入一个默认初始化元素到矢量中去,而无需考虑矢量类型:

#include <vector>
using namespace std;

// 函数insert_one()的参数T
// 随着矢量T的变化而变化

template <class T> void insert_one(vector<T> &v)
{
 T t=T(); // 确保内建类型是默认初始化的(default-initialized)
 v.push_back(t);
}
vector <int> vi;
vector <char> vc;
insert_one(vi);
insert_one(vc);

这个代码的工作与我们的预期完全吻合,这是因为矢量例化的时候,编译器会自动产生与之相匹配的函数模板版本。例如,当函数调用如下时:

insert_one(vi);

编译器分析vi的类型并产生与之匹配的函数,如下所示:

insert_one(vector <int> &v);



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134