我需要创建一个模板函数,作为参数接收某种类型的std :: container - 让我们说std :: vector并删除该容器中的所有元素。我需要一个与此相当的功能:
for_each(some_vector.begin(), some_vector.end(), [](some_vector_type* element){delete element;});
电话应该是这样的:
delete_all_elements(some_vector);
这可能吗?
编辑:我想在delete_all_elements
中使用第一个代码答案 0 :(得分:13)
为什么不是?
template <typename C>
void delete_all_elements(C& container) {
std::for_each(
container.begin(), container.end(),
[](typename C::value_type ptr) { delete ptr; }
);
container.clear();
}
您可以添加例如static_assert(std::is_pointer<typename C::value_type>::value, "Elements must be pointers");
一开始就确保您不会尝试删除非指针。
答案 1 :(得分:1)
为什么不做几乎每个STL算法的事情:
template<typename Iterator>
void delete_all_elements(Iterator begin, Iterator end) {
while (begin != end) {
delete *begin;
++begin;
}
}
答案 2 :(得分:1)
规范方式是:
template <typename I>
void delete_all_elements(I begin, I end)
{
for (; begin != end; ++begin) delete *begin;
}
答案 3 :(得分:0)
您正在寻找这个(C ++ 03解决方案):
template<typename Container>
void delete_all(const Container & c)
{
typename Container::const_iterator begin = c.begin(), end = c.end();
while ( begin != end ) { delete *begin; ++begin; }
}