我有两个erase_all_if
函数模板的实现。
template <typename Container, typename Pred>
typename Container::size_type erase_all_if(Container& c, Pred&& pred)
{
auto newend = std::remove_if(c.begin(), c.end(), std::forward<Pred>(pred));
auto ret = c.end() - newend;
c.erase(newend, c.end());
return ret;
}
template <typename Container, typename Pred>
auto erase_all_if(Container& c, Pred&& pred) {
typename Container::size_type removed = 0;
for (auto it = c.begin(); it != c.end();) {
if (pred(*it)) {
it = c.erase(it);
++removed;
}
else {
++it;
}
}
return removed;
}
第一个只适用于std::vector
这样的容器,因为它需要一个随机访问迭代器,第二个适用于所有容器,但对于连续容器来说效率更低,适合基于节点的容器。如何消除这两个版本的歧义?我目前使用的C标准是C17。
2条答案
按热度按时间dgsult0t1#
你不需要SFINAE在这里。我会把这两个功能合二为一,然后
也可以使用标记分派:(注意迭代器类别是相互继承的,所以这很好地处理了类别之间的回退)
xdyibdwo2#
这里不需要SFINAE。你可以在这里使用添加一个辅助模板来接收interator类别作为附加参数。你甚至可以用C++11做一些调整。