我正在尝试实现一个简单的GetOrCreate()方法 - 按键获取对象,或者如果尚未存在则创建一个新对象。到目前为止还没有脑子。我也希望我的函数的返回值为Status
。所以我创建了以下内容:
Status GetOrCreate(KeyType key, ObjectType* object) {
Status s = OK;
decltype(my_map)::iterator iter;
bool inserted_new;
std::tie(iter, inserted_new) = clients_.insert(key, ObjectType(...));
if (inserted_new) {
// s = ... Initialize the new ObjectType ...
}
*object = iter->second;
return s;
}
调用函数:
ObjectType result(...);
Status s = GetOrCreate(key, &result);
现在,我觉得这有点浪费,因为:
*object = iter->second;
ObjectType result(...)
; (不确定。我可能错了,或者c ++ 11可能会让他们失望。我仍然想明确知道我在做什么)。
所以我创建了一个版本#2,它通过了ObjectType** object
。我不怕双指针,但可能需要向我的评论者提供更多解释。由于project code-style,*&
不是一个选项。
似乎是一个非常基本的设计问题,但我正在摸不着头脑。那么,在这里使用双指针是否合理呢?有更好的方法吗?
我正在使用C ++ 11(我的大部分经验是98)。
答案 0 :(得分:0)
如何使用智能指针:
std::pair<Status, std::shared_ptr<ObjectType>> GetOrCreate(KeyType key) {
Status s = OK;
decltype(my_map)::iterator iter;
bool inserted_new;
std::tie(iter, inserted_new) = clients_.insert(key, ObjectType(...));
if (inserted_new) {
// s = ... Initialize the new ObjectType ...
}
return std::pair<Status, std::shared_ptr<ObjectType>>(s, iter->second);
}
并像这样使用它:
auto ret = GetOrCreate(key, result);
// ret->first is Status
// ret->second is std::shared_ptr<ObjectType>