我有一組非常不同的類型,我希望將實例存儲在單個集合中,特別是地圖。爲此,我使用類型擦除成語,即。我從該模板,類型特定類繼承的非模板基類:類型擦除:在編譯時檢索值類型檢查
struct concept
{
virtual std::unique_ptr<concept> copy() = 0; // example member function
};
template <typename T>
struct model : concept
{
T value;
std::unique_ptr<concept> copy() override { ... }
}
然後我店unique_ptrs到概念在我的地圖。爲了檢索這個值,我有一個模板化的函數,它對指定的類型進行動態轉換。
template <typename T>
void get(concept& c, T& out) {
auto model = dynamic_cast<model<T>>(&c);
if (model == nullptr) throw "error, wrong type";
out = model->value;
}
我不喜歡這個解決方案是,指定一個錯誤的T只在運行時檢測到。我真的很喜歡這個在編譯時完成。
我的選擇是因爲我看到下面,但我不認爲他們能在這裏幫助:
通過對每個類型的過載,或模板函數指定免費使用的功能特設多態性,但我不知道在哪裏存儲結果。
使用CRTP將不起作用,因爲那麼基類將需要模板化。
從概念上講,我需要一個虛擬函數,它需要一個類的實例來存儲結果。然而,由於我的類型是根本不同的,這個類需要模板化,這不適用於虛擬。
不管怎麼說,我甚至不知道這在邏輯上是可行的,但如果有辦法做到這一點,我會很高興。
整個擦除類型是將類型分辨率移動到運行時。編譯時檢查沒有多大意義。 – Frank
另外:你應該避免拋出原始字符串,而是使用'std :: exception'。 – Frank
你可能想要'variant'而不是你的基類。在這兩種情況下,您都可以使用訪問者。 – Jarod42