首页 > 解决方案 > 如何为采用 stl 容器迭代器的函数提供函数签名?

问题描述

我想编写一个my_func可以这样调用的函数,但不在乎它v是 a std::vector,它可以是任何 STL 容器。有点像std::for_each

std::vector<std::string> v = {...};
my_func(v.begin(), v.end());

但我无法弄清楚函数签名。

void my_func(??? i1, ??? i2)
{
  std::for_each(i1, i2, ...); // dumb example implementation
}

我不擅长模板编程,所以即使查看函数声明std::for_each也无济于事。

是否有一个简单的实现,或者这从根本上会使模板变量变得混乱?

标签: c++functiontemplatesstlc++14

解决方案


这取决于您希望函数的通用性。如果迭代器类型必须匹配,那么

template <typename T>
void my_func(T i1, T i2)
{
    std::for_each(i1,i2,...); //dumb example implementation
}

是你所需要的全部。如果您希望它们能够有所不同,那么您只需要另一个模板参数,例如

template <typename T, typename U>
void my_func(T i1, U i2)
{
    std::for_each(i1,i2,...); //dumb example implementation
}

最后,如果您不喜欢处理模板,您可以改用 lambda 并让编译器为您处理。那会给你

auto my_func = [](auto i1, auto i2)
{
    std::for_each(i1,i2,...); //dumb example implementation
};

推荐阅读