2017-03-17 92 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