我有一个模板化函数,它根据调用者指定的算法选择 vector 或列表元素:
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(); });
但是我很明显地卡在了参数部分,用问号表示...
最佳答案
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。开始(); }
而不是 skypjack 在评论中的建议。
此外,我建议将 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
生成了多少程序集。
关于c++ - 在 std::function 中使用模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856070/