1

我想知道一件事。我有一个有 1 个重载成员函数的类:

class A{
    public:
    class const_iterator{};
    class iterator : public const_iterator{};
    iterator find(const K &key);
    const_iterator find(const K &key) const;
};

广告。iterator 继承自 const_iterator,但它没有添加任何内容。

我想做的是,在正常的 find 调用 const find 中。像这样的东西:

typename A::iterator A::find(const K &key){
     const_iterator it(find(key));
     return (*(iterator*)&it);
}

我不需要非常量查找 ATM 的不同实现。有可能做这样的事情吗?因为现在我进入了无限循环,在 find 之前添加“A::”并没有改变任何东西。

4

2 回答 2

2
const_cast<const A*>(this)->find(key);
于 2012-11-18T13:40:19.910 回答
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在此处使用。

于 2012-11-18T13:41:10.767 回答