【问题标题】:type of pair that unordered map emplace returns无序映射 emplace 返回的对的类型
【发布时间】:2017-02-20 08:43:17
【问题描述】:

我有一个函数在 std 无序映射容器上调用 emplace() 方法,我需要返回 emplace() 调用给出的确切返回值。我知道它返回一个迭代器的std::pair(新旧取决于成功操作)和一个代表成功的布尔值。早些时候,我只返回 bool 部分,如下所示:

auto result = map.emplace(std::make_pair(id, someObj));
return result.second;

我知道返回类型是bool。但是现在我需要返回原始的result 变量,但我不知道它的类型,那么我应该在其类中的函数原型中放入什么?

我尝试在迭代器上使用typeid 方法,但它给出了:

St4pairINSt8__detail14_Node_iteratorIS_IKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_ELb0ELb1EEEbE

作为输出。

【问题讨论】:

  • 您应该查阅一些文档。该标准是唯一确定的来源,但一个很好的近似值是:en.cppreference.com/w/cpp/container/unordered_map
  • @GManNickG 我试图在那里找到答案但失败了,那里只写了KeyIterator 术语,我猜这不是确切的类型。
  • 直接从emplace返回,即返回std::pair<iterator,bool>。该接口是标准的,并在您的包装器中明确说明。我会问为什么需要一个标准函数的包装器?
  • std::pair<std::unordered_map<K,V>::iterator, bool> 其中KV 是您的地图模板化的实际类型。如果KV 是从属名称,您需要在std::unordered_map 前面加上typename

标签: c++ c++11 unordered-map


【解决方案1】:

您可以使用 C++11 的尾随返回类型和 decltype 来完成此操作。这样做我们会有一个类似的函数

auto some_function(some_parameters) -> decltype(map.emplace(id, someObj))
{
    return map.emplace(id, someObj);
}

现在编译器将推断返回类型正好是 emplace 调用的返回。

如果你可以使用 C++14 或更高版本,那么你可以使用自动返回类型推导并将代码简化为

auto some_function(some_parameters)
{
    return map.emplace(id, someObj);
}

这里编译器会将函数的返回类型推导为return语句从函数返回的类型。请注意,您不能以这种方式在函数体中返回不同的类型,因为编译器无法推断出要使用的类型。


请注意,在上面的示例中,我没有使用 std::make_pairemplace。与 insert 不同,它需要 pair,您可以直接在 emplace 中构造。

【讨论】:

  • 使用足够新的 C++,您可以在这种情况下省略尾随返回类型(编译器可以从 return 语句中推断出)。
  • @TobySpeight 刚刚添加。 Q 被标记为 C++11,所以我把它省略了,但我想得越多,我想我应该让他们知道的越多。谢谢。
  • @RyanHaining 已更新。谢谢。
  • 我正在使用带有 c++14 标志的 gcc 6.x 编译器,但自动返回类型对我不起作用。可能是因为该函数是一个类方法..
  • @NathanOliver 可以声明,但定义必须在任何调用前可见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2020-08-19
相关资源
最近更新 更多