有沒有一種方法來定義可以從'const'&'非const'對象訪問的成員函數?通用成員函數定義,可從'const'和'non-const'對象實例化
我需要這個爲我的sList
實現列表類。在這個函數中,我想聲明一個函數,該函數將'const'或'non-const'指針作爲參數的另一個函數指向sList
,並將其稱爲當前sList
結構中的每個列表。
這裏是它的聲明:
template <typename T>
struct sList
{
sList(initializer_list<T>);
inline void DoForEachList(auto pFunc)
{
for(auto p = this; p; p = p->pNext)
pFunc(p);
}
~sList();
T dat;
sList *pNext = nullptr;
};
我使用auto pFunc
因爲我想最終lambda表達式通得過。所以,現在如果我有一個這種類型的const對象,並從它的'DoForEachList'作爲參數lambda函數進行調用,並且類型爲'auto'的1個參數。我的編譯器將失敗的東西,如:
error: passing
const sList<unsigned char>
asthis
argument ofvoid sList<T>::DoForEachList(auto:1)
[withauto:1
=main()::<lambda(sList<unsigned char>*)>
;T
=unsigned char
]' discards qualifiers [-fpermissive]
和代碼調用DoForEachList
:
void main()
{
extern const sList<unsigned char> cvobj;
cvobj.DoForEachList([] (auto pCurr) {/* Do something */});
}
有一些方法可以讓我定義DoForEachList
成員函數(或成員函數模板)是這樣的:
template <typename T>
struct sList
{
inline void DoForEachList(auto pFunc) auto //either 'const' or none
{
for(auto p = this; p; p = pNext->pNext)
pFunc(p);
}
//...
};
您可以使用朋友函數模板,也可以使用兩個成員函數包裝器。 – dyp 2014-11-22 22:04:27
非常簡單 - 一個非const對象總是可以綁定到一個'const'引用,但不是相反。這是一個隱式轉換(合格轉換)。嗯。如果你真的想修改對象,但是如果你在一個非const對象上調用它,那就沒用了。在這種情況下,只需編寫兩個函數。 – Deduplicator 2014-11-22 22:06:15
身體一樣 - 呃,這是最好的方法嗎?使用包裝函數不是一個解決方案,因爲那麼'pFunc'參數會被錯誤地推導出來(如果我們在'const'成員函數中使用const_cast'this'包裝'非const'調用,那麼lambda函數arg將被推斷爲' sList *'這是錯誤的)。 – AnArrayOfFunctions 2014-11-22 22:26:31