我有一个模板化函数,它根据调用者指定的算法选择一个向量或列表元素:
template<typename It>
void Foo(It begin, It end, std::function<It(It, It)> GetElement)
{
It element = GetElement(begin, end);
}
如何使用lambda表达式调用此函数?
我的第一个方法是
Foo(v.begin(),
v.end(),
[v](? , ? ) {return v.begin(); });
但是,我顽固地陷入了争论部分,这个部分被问号所标记......
答案 0 :(得分:5)
<强> C ++ 11 强>:
Foo(v.begin(),
v.end(),
[v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });
<强> C ++ 14 强>:
Foo(v.begin(),
v.end(),
[v](auto a, auto b) { return v.begin(); });
如果您不关心参数a
和b
,则可以在评论中使用:[v](auto...){ return v.begin(); }
代替 skypjack 。< / p>
另外,我建议将lambda作为模板参数传递,除非你有充分的理由使用std::function
:
template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
It element = GetElement(begin, end);
}
我写了一篇与主题相关的文章:
"Passing functions to functions"
它包含一些基准测试,显示与模板参数和其他解决方案相比,为std::function
生成了多少程序集。