![](/img/trans.png)
[英]how to call overloaded function in the same version of another in c++
[英]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
通過簡單的鑄造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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.