[英]const_cast issue with std::map
我最近遇到了一個問題,可以避免這種情況的唯一方法就是使用const_cast-但我猜想有一種我不打算避免這種方法而無需更改代碼功能的方法。 下面的代碼片段將我的問題簡化為一個非常簡單的示例。
struct Nu
{
Nu() {v = rand();}
int v;
};
struct G
{
~G()
{
for(auto it = _m.begin(); it != _m.end(); it++) delete it->first;
}
void AddNewNu()
{
_m[new Nu] = 0.5f;
}
void ModifyAllNu()
{
for(auto it = _m.begin(); it != _m.end(); it++) it->first->v++;
}
float F(const Nu *n) const
{
auto it = _m.find(n);
// maybe do other stuff with it
return it->second;
}
map<Nu*, float> _m;
};
在這里,假設Nu實際上是一個非常大的結構,其布局已通過匹配外部庫的需要得到固定(因此,“ float”不能簡單地折疊成Nu,並且由於各種其他原因而無法map<Nu, float>
)。 G結構具有一個映射,用於保留它創建的所有Nu(並最終在銷毀時將其全部刪除)。 如所寫,函數F將不會編譯-無法按std :: map的預期將(const Nu * n)強制轉換為(Nu n)。 但是,由於某些非const函數仍需要修改_m內部的Nu,因此無法將map<const Nu*, float>
切換到map<const Nu*, float>
。 當然,我也可以將所有這些Nu都存儲在附加的std :: vector中,然后將映射類型切換為const-但這會引入一個完全不需要的向量。 因此,我目前唯一想到的選擇是在F函數中使用const_cast(應該是安全的const_cast),我想知道這是否可以避免。
經過更多的探索之后,這里已經解決了完全相同的問題: 使用const參數調用map :: find
這是因為map
期望Nu* const
,但是您給了它一個const Nu*
。 我也覺得這很不合邏輯,也不明白為什么,但這就是事實。
在您的情況下,“查找”將返回const_iterator。 放置:
map<Nu*,float>::const_iterator it = _m.find(n);
...
return it->second;
我認為應該可以工作。
由於您使用的是const方法,因此您只能閱讀您的地圖,而不能編寫/修改它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.