当返回值被占用时,是否可以使用双指针输出参数?

时间:2017-10-18 13:16:54

标签: c++ c++11 pointers

我正在尝试实现一个简单的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);

现在,我觉得这有点浪费,因为:

  1. *object = iter->second;
  2. 中有不必要的副本
  3. ObjectType result(...);
  4. 中有一个不必要的对象初始化

    (不确定。我可能错了,或者c ++ 11可能会让他们失望。我仍然想明确知道我在做什么)。

    所以我创建了一个版本#2,它通过了ObjectType** object。我不怕双指针,但可能需要向我的评论者提供更多解释。由于project code-style*&不是一个选项。

    似乎是一个非常基本的设计问题,但我正在摸不着头脑。那么,在这里使用双指针是否合理呢?有更好的方法吗?

    我正在使用C ++ 11(我的大部分经验是98)。

1 个答案:

答案 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>