返回指向std :: map中缓存的项的指针

时间:2013-04-19 11:26:42

标签: c++ boost c++98

我有一个充当缓存的类。它有以下私人成员:

std::map<std::string, Foo> _cache;

我需要为这个缓存编写一个getter,它返回一个引用,指针,迭代器或智能指针,指向存储在缓存中的Foo对象。我希望客户端能够通过getter更新Foo对象。

但是,如果在缓存中找不到该项,我不希望getter抛出。相反,客户端应测试返回的值以确定是否找到该项。但是,如果你推荐这种方法,我可以说服。

你会为我的吸气剂推荐什么样的回报类型?

我正在使用boost和C ++ 98。

3 个答案:

答案 0 :(得分:4)

听起来您需要boost::optional<Foo&>返回值(optional references)。您的代码应如下所示:

class YourCache {
    std::map<std::string, Foo> _cache;
public:
    boost::optional<Foo&> FooByName(const std::string& name)
    {
        std::map<std::string, Foo>::iterator itr = _cache.find(name);
        if(_cache.end() == itr)
            return boost::none;
        return boost::optional<Foo&>(itr->second);
    }
};
  • getter不扔:)
  • 尊重已经存在的_cache实现(您不必将其更改为存储智能指针 - 或一般指针)
  • 在客户端代码中没有直接访问内存(比如返回Foo *会)
  • 以最佳方式表达意图(“返回值是可选的/可能会丢失”)
  • 在客户端代码中提供了一个明确且自然的界面:

例如:

// client code:
if (boost::optional<Foo&> result = YourCache.FooByName("FOO")) {
    // only run if result is in cache
    result->bar();
}

答案 1 :(得分:2)

在你的情况下,由于可能返回空指针,引用是不可能的。如果它实际上指向一个元素而不能访问缓存的.end()函数,它是一个私有成员,那么迭代器也是不可能的,因为你无法测试。除非你提供一个测试界面,但这是一个过度杀伤。

唯一的另一种选择是返回一个指针。但是,通过这种方式,您必须保证指针在调用者使用它的整个时间内保持有效。一种方法是实现共享指针的映射,即:

std::map<std::string, boost::shared_ptr<Foo> > _cache;

这样,即使将对象抛出缓存,调用者仍然会留下有效的指针。并且shared_ptr可以进行bool测试,因此如果在缓存中找不到项,则可以返回空的shared_ptr。

但是对缓存的上下文知之甚少(例如,如果需要同步等)。

答案 2 :(得分:1)

使用持有Foo参考的boost::optional作为吸气剂的返回值。