无序地图emplace返回的对的类型

时间:2016-10-11 17:48:51

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

我在std无序地图容器上调用emplace()方法的函数,我需要返回emplace()调用给出的确切返回值。我知道它返回一个std::pair的迭代器(无论新旧取决于成功的操作)和bool表示成功。早些时候,我只返回了这样的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

作为输出。

1 个答案:

答案 0 :(得分:6)

您可以使用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的{​​{1}}不同,您可以直接在pair中构建。