gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:38:17 24 4
gpt4 key购买 nike

我正在考虑 this question关于 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 转换为迭代器,因为它们很可能被实现为指针。我不想依赖这个。有更通用的解决方案吗?

最佳答案

您可以使用一些技巧。 You can turn a const_iterator into an iterator if you have non-const access to the container. (你做的):

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_pointer_cast 这样的 const_iterator_cast?也许我们应该。

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

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

您正在取消引用 const_cast 的结果,但是只要非常量 Z 不修改 X 。与我给出的其他 2 个解决方案不同,这是我可能会在实践中使用的解决方案。

关于c++ - 从返回迭代器的 const 和非常量方法中删除代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com