我有一个充当缓存的类。它有以下私人成员:
std::map<std::string, Foo> _cache;
我需要为这个缓存编写一个getter,它返回一个引用,指针,迭代器或智能指针,指向存储在缓存中的Foo对象。我希望客户端能够通过getter更新Foo对象。
但是,如果在缓存中找不到该项,我不希望getter抛出。相反,客户端应测试返回的值以确定是否找到该项。但是,如果你推荐这种方法,我可以说服。
你会为我的吸气剂推荐什么样的回报类型?
我正在使用boost和C ++ 98。
答案 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);
}
};
例如:
// 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作为吸气剂的返回值。