所以我不確定這在 C 中是否完全可行,但我想確保一個類在默認情況下總是被強制轉換為另一種型別。這是我想象的一個例子:
class A : public always_cast<std::string> {
private:
std::string *actualData = new std::string("foo");
public:
operator std::string &(){
return *this->actualData;
}
};
void main(){
A value;
std::cout << value.append(" bar") << std::endl; // should print "foo bar"
}
目前,我能得到的最接近這種行為的方法是重寫強制轉換運算子,但我必須顯式強制轉換它才能訪問std::string的成員函式:
class A {
private:
std::string *actualData = new std::string("foo");
public:
operator std::string &(){
return *this->actualData;
}
};
void main(){
A value;
std::cout << ((std::string) value).append(" bar") << std::endl; // successfully prints "foo bar"
}
這是我想如何使用它的一個簡單示例。我正在嘗試構建一個僅包含大量模板的標頭庫,并且“始終強制轉換”型別可以是任何型別別。雖然手動轉換不是一個交易破壞者,但它增加了一個額外的步驟,我希望允許使用我的庫的開發人員跳過,因為他們的代碼方便和可讀。我的庫目前正在使用 C 20。
那么有什么方法可以實作我想不到的這個(或類似的)功能嗎?或者這只是一個白日夢,我應該滿足于讓我的圖書館使用起來稍微不方便?
編輯:好吧,我可以從回復的背景關系中看出這不太可能,即使我可以成功,也可能不是一個很好的設計選擇。我認為我的用例的最佳解決方案是覆寫->運算子并使用它來訪問欄位,正如某些人在評論中所推薦的那樣。
uj5u.com熱心網友回復:
您所談論的內容廣泛概念化為以類似于我們如何多載的方式多載“運算子點”的能力operator*。過去幾年有很多關于向 C 提供此功能的提議,但沒有一個達成共識。我對委員會的解讀是,就像 UFCS 一樣,他們基本上已經放棄了。
最大的癥結之一是沖突問題。如果你的類A本身有一個append函式,那么呼叫哪個函式?有人說它應該始終是轉換后的型別;其他人說它應該始終是主型別別;其他一些人說這應該是編譯錯誤。
不,沒有其他方法可以呼叫轉換函式來進行.whatever編譯。一些“運算子點”建議使用“基類”作為解決所有沖突問題的一種方式(因為這些問題都已針對基類得到解答),但目前,該語言無法滿足您的要求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/523299.html
標籤:C 遗产c 20
上一篇:將子類值的映射轉換為超類值的映射
