【问题标题】:avoiding code duplication in const and non-const member functions [duplicate]避免 const 和非常量成员函数中的代码重复 [重复]
【发布时间】:2012-01-28 13:36:24
【问题描述】:

嗯,我目前正在重构我很久以前制作的一个类。该类是一个容器类型。

许多函数可以利用类结构的优势,因此被实现为成员函数。但是现在似乎有很多功能看起来“相同”,即“查找”功能:

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 搜索的)和一个带有子树的“列表”。 find 函数在树的所有子树(和子子树)上递归工作。 - 就像人们在搜索一棵树时所期望的那样。

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

【问题讨论】:

  • @FredOverflow:好点子。迭代器和算法的存在正是为了解决 OP 想要自己再次滚动的问题。
  • @FredOverflow,Kerrek:不完全是。是的,std::find 存在,但std::map::findstd::set::find 等也存在。
  • @OliCharlesworth:但没有map::find_if :-) 是的,在适当的时候提供一个成员函数,但如果它只做与通用算法相同的事情,则不是。
  • @KerrekSB(和任何人)-我对为什么使用成员方法查找做了一些说明。 (也许我应该重命名它,尽管从课外看它很有意义)。
  • 我明白为什么 member-find 很有用(你实际上是在重新发明 std::set)。我不明白您为什么需要自定义 find_if,我也不明白为什么您不能提供带有 begin 和 end 的普通迭代器接口。

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


【解决方案1】:

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

【讨论】:

【解决方案2】:

Scott Meyers 在 Effective C++ 的第 3 项中解决了类似的问题,方法是在非常量版本中调用 const 版本,然后将 const 结果转换回非常量:

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));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多