避免const和非const成员函数中的代码重复

时间:2011-12-27 14:33:08

标签: c++ iterator const containers code-duplication

好吧,我现在正在重构我很久以前做过的课程。该类是容器类型。

许多函数可以利用类结构的优点,因此实现为成员函数。然而,它现在似乎是很多看似“相同”的功能,即“查找”功能:

iterator find(ITEM)
const_iterator find(ITEM) const;
iterator find_if(ITEM, PRED)
const_iterator find_if(ITEM, PRED) const;

4“函数”描述几乎相同(并且每个版本的代码几乎相同)。更新课程时这变得非常繁琐,我必须确保每个版本都升级。有没有办法更好地处理这些事情?类 CAN 中的其他一些函数可能需要2个谓词,这意味着我突然有8个函数需要管理。

我试过调用“常量版本中的非常量版本”,但这显然不起作用。

那么如何处理这些事情呢?只需咬紧牙关并写下来?

编辑:只是为了通知:我的数据结构类似于“树”。每个“对象”包含数据(查找搜索)和带有子树的“列表”。 find函数在树(和子子树)的所有子树上递归递归。 - 就像人们在搜索树时所期望的那样。

由于没有明确的“结束”或“开始”迭代器到这样的树,使用std :: find不会产生正确的功能。

2 个答案:

答案 0 :(得分:8)

Scott Meyers通过调用非const版本中的const版本然后将const结果转换回非const来解决 Effective C ++ 第3项中的类似问题:

const_iterator find(const T& value) const
{
    // actual implementation of find
}

iterator find(const T& value)
{
    return const_cast<iterator>(static_cast<const container*>(this)->find(value));
}

答案 1 :(得分:2)

如果您愿意使用C ++ 11标准,则可能会对此模式(使用单个模板迭代器类和两个typedef)感兴趣:   http://www.sjvs.nl/c-implementing-const_iterator-and-non-const-iterator-without-code-duplication/