在函数内部,调用其重载版本

时间:2012-11-18 13:39:01

标签: c++ class overloading

我想知道一件事。我有一个有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 ::”并没有改变任何东西。

2 个答案:

答案 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