我有一个充当缓存的类。它有以下私有(private)成员:
std::map<std::string, Foo> _cache;
我需要为此缓存编写一个 getter,它返回指向存储在缓存中的 Foo 对象的引用、指针、迭代器或智能指针。如果需要,我希望客户端能够通过 getter 更新 Foo 对象。
但是,如果在缓存中找不到该项,我不希望 getter 抛出异常。相反,客户端应该测试返回值以确定是否找到该项目。但是,如果您推荐这种方法,我可以说服您抛出。
您会为我的 getter 推荐哪种返回类型?
我正在使用 boost 和 C++98。
最佳答案
听起来你需要一个 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* 那样)
- 以最好的方式表达意图(“返回值是可选的/可能会丢失”)
- 在客户端代码中提供一个明确且自然的接口(interface):
例如:
// client code:
if (boost::optional<Foo&> result = YourCache.FooByName("FOO")) {
// only run if result is in cache
result->bar();
}
关于c++ - 返回指向缓存在 std::map 中的项目的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16103541/