对不起,如果我的英语或我的编码约定不好。
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++ 标准库列表”用例只是一个更好地解释我的问题的例子。