在std :: function中使用模板参数

时间:2017-03-17 11:14:30

标签: c++ templates

我有一个模板化函数,它根据调用者指定的算法选择一个向量或列表元素:

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(); });

但是,我顽固地陷入了争论部分,这个部分被问号所标记......

1 个答案:

答案 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(); });

如果您不关心参数ab,则可以在评论中使用:[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生成了多少程序集。