簡體   English   中英

const_cast問題與std :: map

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM