2017-03-17 84 views
1

我有一个模板功能,其拍摄基于调用者指定的算法,向量或列表元素:使用模板参数::功能

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

但我obiously被困在参数部分,它是由问号象征...

+0

它不能从lambda的'std :: function '推导出来。你可能想要我们还没有的概念:/ – Jarod42

回答

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建议。


另外,我建议传递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生成了多少程序集,一个模板参数和其他解决方案。

+0

不是'[v](auto ...){return v.begin(); }'很好?无论如何你都不使用'a'和'b'。 – skypjack

+0

@skypjack:当然,我(也许不正确)认为'{return v.begin(); }'身体只是一个占位符。我也想给出最一般的方式来匹配两个参数。 –

+0

我将如何调用模板功能版本? – user1934212