模板多態性:當模板發揮不佳時
在 C 中,模板為泛型編程提供了強大的機制。然而,它們的多態行為有其限制。本文回答了特定場景下模板多態性缺失的問題。
查詢
使用者在呼叫建構子時遇到「無符合函數」錯誤它採用 Container
深入研究多態性
多態性允許不同類別的物件被視為公共基類的物件。但是,此行為不會擴展到 C 中的範本。儘管 Foo 衍生自 Interface,但它不會自動使 Container
模板的非協方差
這裡的關鍵方面是缺乏模板協方差。在協變範本中,派生類型會自動被視為需要其基底類型的範本的有效參數。然而,在 C 中,模板不是協變的。
協變的後果
考慮以下範例:
class Fruit {...}; class Apple : public Fruit {...}; class Orange : public Fruit {...}; std::vector<Apple>& apple_vec; // Vector of apples std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!
如解釋所指出的,協變處理範本可能會導致應變處理範本可能會導致應變相容的類型被視為相容的情況,從而破壞類型安全。
替代解決方案
因為不支援協變模板C,需要採用替代解決方案。靜態斷言或有界通配符(在 Java 中可用)可用於強制執行所需的型別關係。在查詢中提到的具體場景中,一個簡單的靜態斷言就可以驗證傳入的Container類型確實是Container
以上是為什麼我不能將「Container」傳遞給需要「Container」的建構子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!