无序映射位置返回的对的类型

type of pair that unordered map emplace returns

本文关键字:类型 返回 映射 位置 无序      更新时间:2023-10-16

我有一个在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

作为输出。

您可以使用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中构建。