簡體   English   中英

在函數內部,調用其重載版本

[英]Inside function, call its overloaded version

我想知道一件事。 我有一個有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,但它沒有添加任何東西。

我想做的是,在正常的find中調用const find。 像這樣的東西:

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

我不需要不同的實現非const查找ATM。 可以這樣做嗎? 因為現在我進入了無限循環,在find之前添加“A ::”並沒有改變任何東西。

const_cast<const A*>(this)->find(key);

一般來說,遺憾的是,沒有清潔解決方案。

可以調用重載find通過簡單的鑄造thisA 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM