c++ - 返回指向缓存在 std::map 中的项目的指针

标签 c++ boost c++98

我有一个充当缓存的类。它有以下私有(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/

相关文章:

c++ - 单独构造结构体的数据成员是否合法?

c++ - std::deque 真的是线程安全的吗?

C++98 替代 std::stoul?

f(void*&) 调用时出现 C++ 错误

c++ - 通过继承而非组合锁定

c++ - 如何减小 WASM 二进制文件的大小?

python - 为什么 Boost Python 试图实例化一个抽象类型?

c++ - 错误 C2011 和定义

c++ - 仅使用几乎相等的标准(无排序)从容器中删除重复项的最有效方法是什么

c++ - 共享内存中的映射 : Boost. 由于未满足 date_time 依赖性,进程间演示失败