C++11 - 将变量放置到任何标准容器(向量、列表、集合、unordered_set)

C++11 - emplacing a variable to any std container (vector, list, set, unordered_set)

正在尝试编写通用代码以将默认构造的对象放入 std 容器和 return 迭代器。

插入解决方案是

template<typename C>
typename C::iterator insert(C& container)
{
    return container.insert(container.end(), typename C::value_type());
}

但是 emplace 没有这样的通用接口,所以我不得不专门针对 2 种容器类型。 我最好的尝试(没有编译)是:

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace_back())
{
    return container.emplace_back();
}

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace().first)
{
    return container.emplace().first;
}

这导致:error: void value not ignored as it ought to be

而且我不明白为什么我的 decltype 被推断为无效。

使用 gcc 4.8.5 和 -std=c++11

编辑:

转载者

int main() { std::vector v; std::vector::迭代器 iv = emplace(v);

    std::set<int> s;
    std::set<int>::iterator is = emplace(s);
    return 0;

}

编辑 2:

第二次尝试

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace().first)
{
    return container.emplace().first;
}

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace(container.end()))
{
    return container.emplace(container.end());
}

适用于 verctor,但设置不明确。

好吧,我花了比应该的时间更长的时间。

emplace_back() 只有 return 自 C++17 以来的放置对象。在此之前,它 returns void,甚至在 C++17 中 return 类型是引用,而不是迭代器。

看来您的 emplace_back() 专业应该改为 return container.back()

终于解决了感谢@Quentin:

// For vector, list and anything push_backable
template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace_back(),container.rbegin())
{
    container.emplace_back();
    return container.rbegin();
}

// For set,unordered_set, and anything that emplace returns a pair.
template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace().first)
{
    return container.emplace().first;
}