模板化类的继承时,如何保持它的通用性?

时间:2013-04-11 16:58:41

标签: c++ templates inheritance stl

很抱歉,如果我的英语或我的编码约定不好。
std :: list是STL列表 我正在尝试根据他的选择创建一个将std::list<>::iteratorstd::list<>::reverse_iterator无缝地用于用户的库。 首先,我不想实现所有std::list<>::iterator方法。所以我会把它们继承到我的班级:

template <class realIter> class directedListTypeIter : public realIter

用户将使用2个可能的模板实例化directedListTypeIter:

directedListTypeIter<std::list<value>::iterator>
directedListTypeIter<std::list<value>::reverse_iterator>

这意味着我应该创建以下赋值运算符(或复制构造函数):

directedListTypeIter& operator=(std::list<value>::reverse_iterator &constructorIter) {
   ((std::list<value>::reverse_iterator*)this)->operator=(constructorIter);
   return *this;
}

directedListTypeIter& operator=(std::list<value>::iterator &constructorIter){
   ((std::list<value>::reverse_iterator*)this)->operator=(constructorIter);
   return *this;
}

我需要所有这些赋值运算符用于以下函数实现和其他类似的实现。

directedListTypeIter begin(std::list<value>& userList){ 
  directedListTypeIter<realIter> retVal;
  if (someCheck()){
    retVal = userList.begin();
  } else {
    retVal = userList.rbegin();
  }
  return retVal;
}

换句话说 - 为了实现begin()函数和我需要的其他类似函数,我应该实现赋值运算符(或复制构造函数)。

以下是我的问题:

我。所有这些都取决于“value”结构的存在和用法。如何删除此依赖项?

II。如果我有更多可能的继承类型,我应该为每种类型创建新的赋值运算符(或复制构造函数)吗?是不是模板编程意味着不复制该代码?如何在不将代码复制到每个操作符的情况下进行相同操作?

III。我应该添加以下内容:

 directedListTypeIter& operator=(realIter &constructorIter){
   ((realIter*)this)->operator=(constructorIter);
   return *this;
 }

会编译 - 不添加列出所有可能的继承值的内容吗?

谢谢。

P.S。本主题是关于如何模板化继承,而不是在一个接口中实现两种迭代器类型的使用。我的意思是 - “C ++标准库列表”用例只是一个更好地解释我的问题的例子。

0 个答案:

没有答案