C ++缓存/存储具有不同数据类型的项目

时间:2016-12-20 00:40:07

标签: c++

通常,存储计算量很大的值的最佳做法是什么。我最初只计算了双打并用地图来存储它们

class Calc
{
    map<string, double> m_cache;
    virtual bool isCached(const string& key )
              { return m_cache.find(key) != m_cache_.end(); }

    double getHeavyA() { 
        string key = "a";
        if ( !isCached( key ) ) { m_cache[key] = getHeavyA(); }
        return m_cache[key];
    }

    double getHeavyB() { 
        string key = "b";
        if ( !isCached( key ) ) { m_cache[key] = getHeavyB(); }
        return m_cache[key];
    }

    void clearCache() { m_cache.clear(); }

本身可能不是最优雅,最有效的方式。但是现在我还有函数返回不同的obj / data类型,我宁愿避免使用各种数据类型的映射。有没有首选的方法呢?我只能提出一个包含不同值的结构。这是一个好方法还是有更好的方法?

1 个答案:

答案 0 :(得分:2)

如果您不需要,请不要使用map

template<typename T>
struct Cached {
  T value_;
  bool valid_= false;
  void Update(T x) { value_ = x; valid_ = true;}
  void Uncache() { valid_ = false;}
};

class Calc {
    Cached<double> a_;
    double getA() {
        // don't be tempted to merge this into a call. You don't want to 
        // call getHeavyA() unnecessarily.
        if ( !a.Valid_ ) { a_.Update( getHeavyA()); }
        return a_.value_;
    }

    Cached<int64_t> b_;    
    int64_t getB() { 
        if ( !b.Valid_ ) { b_.Update( getHeavyB()); }
        return b_.value_;
    }

    ...

   void clearCache() { a_.Uncache(); b_.Uncache(); }