C++ 如何为使用stl容器迭代器的函数提供函数签名?

C++ 如何为使用stl容器迭代器的函数提供函数签名?,c++,function,templates,stl,c++14,C++,Function,Templates,Stl,C++14,我想写一个函数my_func,可以这样调用,但不管v是std::vector,它可以是任何STL容器。有点像std::for_each: std::vector<std::string> v = {...}; my_func(v.begin(), v.end()); 我不擅长模板编程,所以即使查看std::for_each的函数声明也帮不了我 是否有一个简单的实现,或者这从根本上说会让模板变量变得混乱?您可以编写一个模板化函数 template<typename Iterat

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

std::vector<std::string> v = {...};
my_func(v.begin(), v.end());
我不擅长模板编程,所以即使查看
std::for_each
的函数声明也帮不了我


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

您可以编写一个模板化函数

template<typename Iterator>
void my_func(Iterator startIter, const Iterator endIter)
{
  std::for_each(startIter, endIter, /* lambda */);
}
语法不是很模糊!以下方法在使用点将范围
用于

template <template<typename...> class Iterable, typename T>
void foo(
    const Iterable<T>& y // the container
){
    for (auto&& e : y){
        // e is the 'thingy' in the container.
    }
}
模板
福娃(
const-iteable&y//容器
){
用于(自动(&e:y){
//e是容器中的“东西”。
}
}

您可以将任意类型的任何iterable容器传递给
foo

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

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

您必须使用模板。每个迭代器都是不同的类型。对于C++库中的所有迭代器没有共同的超类。在我的用例中(在问题中),我在调用它时是否必须指定“代码> T < /CUT>,或者编译器推断THI?.MR.BoY.编译器会为您推断它。object@Mr.Boy谢谢lambda非常有用。它们是现代C++.@ M.Boor的一个我最喜欢的特性,如果你想要的话,你可以用<代码>模板Vo.MyO-Func(t const & c){:fordyOne(C++开始),C结尾()…;//哑的示例实现} //>有趣的方法来抽象迭代器,但不确定这是OP所称的“容易”。(模板参数不是最容易访问的)@formerlyknownas_463035818:我修复了缩进,来吧,这很简单!如果你想让它成为通用的,
T
需要是一个参数包。否则
template class Iterable
就可以了。但是我不认为这比只使用一个
typename T
const T&y
参数有什么好处。Edit:我想带省略号的解决方案涵盖了像
std::vector
这样的情况,它有多个模板参数,但只有第一个没有默认类型。但是一个简单的模板参数也可以涵盖这一点。@formerlyknownas_463035818:但这是一件美妙的事情!也许这个答案不一定针对OP:答案“不需要这样做。@Bathsheba我关心的是,我不明白这个解决方案相对于单个模板参数的好处。
template <template<typename...> class Iterable, typename T>
void foo(
    const Iterable<T>& y // the container
){
    for (auto&& e : y){
        // e is the 'thingy' in the container.
    }
}
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
}
auto my_func = [](auto i1, auto i2)
{
    std::for_each(i1,i2,...); //dumb example implementation
};