我想知道一件事。我有一个有1个重载成员函数的类:
class A{
public:
class const_iterator{};
class iterator : public const_iterator{};
iterator find(const K &key);
const_iterator find(const K &key) const;
};
广告。迭代器继承自const_iterator,但它没有添加任何内容。
我想做的是,在正常查找中调用const find。像这样:
typename A::iterator A::find(const K &key){
const_iterator it(find(key));
return (*(iterator*)&it);
}
我不需要不同的实现非const查找ATM。可以这样做吗?因为现在我进入了无限循环,在find之前添加“A ::”并没有改变任何东西。
答案 0 :(得分:2)
const_cast<const A*>(this)->find(key);
答案 1 :(得分:2)
总的来说,不幸的是,没有干净的解决方案。
您可以通过简单地将find
投射到this
来调用重载的A const*
- 但结果将是错误的类型(const_iterator
而不是iterator
)并且在一般情况下可能没有这些转换(您的(*(iterator*)&it)
在您的情况下不起作用。)
但是,当然,在您的特殊情况下,由于您定义了两个类,因此可以通过向iterator
添加适当的构造函数来定义这样的转换:
class iterator : public const_iterator {
iterator(const_iterator const& other) {
// Construct …
}
};
然后,您可以重新编写非const
find
实现,如下所示:
A::iterator A::find(const int &key){
const_iterator it(const_cast<A const*>(this)->find(key));
return static_cast<iterator>(it);
}
顺便提一下,请注意返回类型中没有typename
。由于A::iterator
不是依赖名称,因此您不需要(并且至少在C ++ 03中,不允许)在此处使用typename
。