2

对不起,如果我的英语或我的编码约定不好。
std::list 是 STL 列表。
我正在尝试制作一个库,可以根据用户的选择无缝地std::list<>::iterator使用他。std::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() 函数和我需要的其他类似函数,我应该实现赋值运算符(或复制构造函数)。

这是我的问题:

一世。这一切都取决于“价值”结构的存在和使用。如何删除此依赖项?

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

iii. 我应该添加以下内容:

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

会编译 - 而不添加列出所有可能的继承值的东西?

谢谢你。

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

4

0 回答 0