我想将元素插入到 STL 容器中(其类型是模板参数)。如果容器允许 back_insertion,我想使用它,否则就使用任何插入器。
我想避免为此实现我自己的特征,我很确定必须有某种方式我可以说“如果可能的话实例化一个 back_inserter,否则实例化一个插入器”。
我该怎么做?
最佳答案
您可以使用带有重载解析的尾随返回类型来执行如下操作:
namespace impl
{
// preferred overload: if we can push_back a Container::value_type
template <class Container>
auto generic_inserter(Container& c, int)
-> decltype(void(c.push_back(std::declval<typename Container::value_type>())),
std::back_inserter(c))
{
return std::back_inserter(c);
}
// fallback if we can't
template <Container>
auto generic_inserter(Container& c, ...)
{
return std::inserter(c, c.end());
}
}
template <class Container>
auto generic_inserter(Container& c)
{
return impl::generic_inserter(c, 0);
}
在 C++11 中,只需将 auto
返回类型替换为 decltype(body-of-function)
。
关于c++ - 获得向后插入器并回退到任何插入器的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36914066/