删除返回迭代器的 const 和非常量方法中的重复代码

2024-02-06

我正在考虑这个问题 https://stackoverflow.com/questions/123758/how-do-i-remove-code-duplication-between-similar-const-and-non-const-member-func关于 const 和非常量类方法。首选答案取自 Scott Meyers 的《Effective C++》,其中非常量方法是根据 const 方法实现的。

进一步扩展,如果方法返回迭代器而不是引用,如何减少代码重复?修改链接问题中的示例:

class X
{
    std::vector<Z> vecZ;    
public:
    std::vector<Z>::iterator Z(size_t index)
    {
        // ...
    }
    std::vector<Z>::const_iterator Z(size_t index) const
    {
        // ...
    }
};

我无法根据 const 方法实现非常量方法,因为如果不使用 distance()/advance() 技术,就不可能直接从 const_iterator 转换为迭代器。

在示例中,因为我们使用 std::vector 作为容器,所以实际上可以从 const_iterator 转换为迭代器,因为它们很可能被实现为指针。我不想依赖这个。有更通用的解决方案吗?


您可以使用一些技巧。如果您对容器具有非常量访问权限,则可以将 const_iterator 转换为迭代器。 https://stackoverflow.com/a/10669041/369872(你这样做):

std::vector<Z>::iterator Z(size_t index)
{
    std::vector<Z>::const_iterator i = static_cast<const X&>(*this).Z(index);
    return vecZ.erase(i, i);
}

你也可以这样做:

std::vector<Z>::iterator Z(size_t index)
{
    return std::next(vecZ.begin(), std::distance(vecZ.cbegin(), static_cast<const X&>(*this).Z(index)));
}

两者都不是特别优雅。为什么我们没有一个const_iterator_cast like const_pointer_cast?也许我们应该。

编辑,我错过了最明显和优雅的解决方案,因为我试图使用非常量方法中的 const 方法。这里我做相反的事情:

std::vector<Z>::const_iterator Z(size_t index) const
{
    return const_cast<X&>(*this).Z(index);
}

您正在取消引用以下结果const_cast然而,只要非常量,这就不是未定义的行为Z不修改任何数据X。与我给出的其他两种解决方案不同,这是我可能在实践中使用的一种解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除返回迭代器的 const 和非常量方法中的重复代码 的相关文章

随机推荐