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;
}
正在尝试编写通用代码以将默认构造的对象放入 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;
}