怎样将模板类当做函数参数传递?

深夜代码党 2011-03-31 02:37:17
我定义了一个bitset:
const int size1=10;
bitset<size> bs1("1110011");

const int size2=9;
bitset<size>bs2("000111");

现在我的一个函数要把两个bitset分别当做参数并且修改它的值,怎么做啊?

void change(bitset<10> &bs){
bs.set(1);
}
这种函数可以处理bs1,不能处理bs2;

void change(bitset<9> &bs){
bs.set(1);
}
这种函数可以处理bs1,不能处理bs2;

但是
void change(bitset<const int size> &bs){
....
}
这种函数又是错误的,那到底该怎样传参啊?
...全文
767 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
深夜代码党 2011-03-31
  • 打赏
  • 举报
回复
7楼正解,thx~
qq120848369 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]

C/C++ code
template<size_t N>void change(bitset<N> &bs){
bs.set(1);
}

int main()
{
bitset<10> bs1(10);
bitset<9>bs2(20);
change(bs1);
change(bs2);
system("pause");
return 0;……
[/Quote]

++
pengzhixi 2011-03-31
  • 打赏
  • 举报
回复
template<size_t N>void change(bitset<N> &bs){
bs.set(1);
}

int main()
{
bitset<10> bs1(10);
bitset<9>bs2(20);
change(bs1);
change(bs2);
system("pause");
return 0;
}
深夜代码党 2011-03-31
  • 打赏
  • 举报
回复
这些答案都似乎都不是我想要的。说明一下,bitset是c++自带的类库,我是无法改它的函数的,除非我写一个类来封装它对它进行操作。
我的意思是怎样把bitset当做函数参数传递,其中bitset<size>中的size也是一个参数。
hzhxxx 2011-03-31
  • 打赏
  • 举报
回复
C++ 中有三类迭代器,分别是插入迭代器(inserter),反向迭代器(reverse_iterator)和流迭代器.

这里(vs2003为例)介绍插入迭代器,插入迭代器分别是std::inserter_iterator,std::back_inserter_iterator,std::front_inserter_iterator 三类,对应的迭代器适配器应该是

std::inserter,std::back_inserter,std::front_inserter 。

1. std::inserter

// TEMPLATE FUNCTION inserter
template<class _Container,
class _Iter> inline
insert_iterator<_Container> inserter(_Container& _Cont, _Iter _Where)
{ // return insert_iterator
return (std::insert_iterator<_Container>(_Cont, _Where));
}
这是是正常的插入迭代器适配器的实现,我们看到函数需要指定容器类型和容器的开始指针(从那个位置开始插入)返回了一个按容器和容器迭代器位置构造出来的迭代器。我们以一个调用例子来说明这个。

std::vector<std::string> v1,v2;
std::copy(v1.begin(),v1.end(),std::inserter(v2,v2.begin()));

这里表示需要把v1的所有元素插入到v2里面。调用的时序是先构造一个std::inserter 的实例A(命名为A),然后通过 std::copy 里面的循环,不断的调用赋值A的赋值运算符号,将v1 里面的元素赋值给v2。我们来看 std::insert_iterator 的实现,

template<class _Container>
class insert_iterator
: public _Outit
{ // wrap inserts into container as output iterator
public:
typedef _Container container_type;
typedef typename _Container::reference reference;

insert_iterator(_Container& _Cont, typename _Container::iterator _Where)
: container(&_Cont), iter(_Where)
{ // construct with container and iterator
}

insert_iterator<_Container>& operator=(
typename _Container::const_reference _Val)
{ // insert into container and increment stored iterator
iter = container->insert(iter, _Val);
++iter;
return (*this);

}

//...省略了insert_iterator其他的函数

看到

insert_iterator<_Container>& operator=(
typename _Container::const_reference _Val)
{ // insert into container and increment stored iterator
iter = container->insert(iter, _Val);
++iter;
return (*this);
}

这里通过传入容器和容器的迭代器,先构造了实例,赋值运算符实际是调用了容器的 container->insert 方法,所以,这里必须需要容器有insert 方法。幸好,几乎所有容器都有insert 方法,所以这个是通用的迭代器。这个insert 方法还必须类似这样声明:

iterator insert(iterator _Where, const _Ty& _Val);

返回一个迭代器,传入位置和值。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hzhxxx/archive/2011/03/30/6288103.aspx
herry-Li 2011-03-31
  • 打赏
  • 举报
回复
将change函数做成模板函数就可以解决了。
pathuang68 2011-03-31
  • 打赏
  • 举报
回复
不要太把模板类当成特别的东西,模板类也就是一种数据类型而已。
hhh_hao 2011-03-31
  • 打赏
  • 举报
回复
将size再做成一个模板类?
pengzhixi 2011-03-31
  • 打赏
  • 举报
回复
既然你可以用模板类,那就可以用模板函数

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧