我想存盤相對于它們的型別的物件。我有一個Status繼承的類以創建不同的狀態,例如Burn,Stun等...
我想將狀態存盤在集合中,每種型別都有一個集合(一個角色可以一次多次燃燒狀態,所以我想獲取存盤所有燃燒狀態但不存盤其他狀態的集合)。
到目前為止我的解決方案看起來像這樣
std::map<std::type_index, std::set<Status*>> statuses;
// access all Burn statuses
for (const Burn* b : statuses.find(typeid(Burn))->second) {} // error : E0144 a value of type "Status *" cannot be used to initialize an entity of type "const DamageModifier *"
**
然而,這是向下轉換,編譯器不希望它作業。
我的問題如下:
- 我如何在不復制的情況下訪問一個集合并將其向下轉換為正確的型別
- 您是否想到任何其他方式來存盤相同子型別的所有狀態并輕松訪問?
- 我不想將它全部存盤在一組動態演員表中,因為它開始變得昂貴
- 我不想為每個新的
Status子類手動宣告一組。
編輯 :
問題是我試圖從上一個代碼版本中一次做兩件事
- 從哪個切換
std::set<Status*>到std::map<std::typeid, std::set<Status*>>哪個都可以,只要你投射的結果和以前一樣 - 至少在這種情況下,試圖隱式轉換一整套無用且幼稚的指標
兩個答案都幫助我意識到問題是我試圖同時做這兩個。
uj5u.com熱心網友回復:
我如何在不復制的情況下訪問一個集合并將其向下轉換為正確的型別
您可以使用static_cast向下轉換:
for (const Status* s : statuses.find(typeid(Burn))->second) {
auto b = static_cast<const Burn*>(s);
}
您必須非常小心,不要將指向錯誤派生類的指標插入錯誤的集合中。這將默默地通過編譯并在運行時中斷(如果你幸運的話)。
uj5u.com熱心網友回復:
你需要在某個地方進行演員表。statuses如果您通過 eg對插入進行了門控void add_status(Status * status) { statuses[typeof(status)].insert(status); },那么您可以安全地進行static_cast,否則您必須小心,因為不正確的static_casting 具有未定義的行為。
如果你有很多地方可以投射收藏,我會很想寫一些_view_cast模板。
template <typename To>
struct static_view_cast_t
{
template <std::ranges::view View>
auto operator()(View view) {
return view | std::ranges::views::transform([](auto & from) -> To { static_cast<To>(from); });
}
template <std::ranges::view View>
friend auto operator|(View view, static_view_cast_t c) {
return c(view);
}
};
template <typename To>
constexpr static_view_cast_t static_view_cast;
等等你需要的每個演員。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/459964.html
上一篇:為什么Object.prototype的__proto__是另一個Object.prototype?
下一篇:如何從c 中的另一個類獲取向量
