[英]Can I use template type T in std::function to pass a lambda type function C++11?
我是c ++ 11的新手,我定義了一個模板來將一個函數作為參數,
template <typename T>
void print_for_each(vector<T> v, std::function<void (T)> func){
std::for_each(v.begin(), v.end(), func);
}
我試圖將以下Lambda表達式傳遞給print_for_each,
auto printElement = [](int y) {
std::cout << y << " ";
};
然后我收到編譯器警告說,
錯誤:沒有用於調用'print_for_each'的匹配函數
然后我改變了模板功能,
std::function<void (int)> func)
這次有效。 我的問題是,std :: function可以采用模板類型T嗎?
謝謝你的回答! :)
Lambdas 與 std::function
s不同。 前者是偽裝的仿函數(函數對象),而后者是不同的野獸。 即使lambda對std::function
“衰減”,在模板類型推導中,編譯器也不會執行隱式轉換。 因此,在這種情況下,編譯器會嘗試匹配兩個不兼容類型的對象,因此它會失敗。
您可能想知道為什么編譯器不執行此類隱式轉換。 這是因為通過在參數類型推導之上執行類型轉換,可以達到許多“矛盾”的情況,其中多個不兼容的類型可以是候選者。
可能的解決方案:
您可以將功能的簽名更改為
template <typename T, typename F> void print_for_each(vector<T> v, F&& func){ std::for_each(v.begin(), v.end(), func); }
你可以將lambda包裝在std::function
並將后者傳遞給你的函數(參見@Brian的評論)
您可以“幫助”編譯器並顯式指定模板類型參數
print_for_each<int>(v, func);
在這種情況下,沒有模板類型推導,並且允許lambda通過隱式轉換衰減到std::function
。
std::for_each
不需要std::function
,只需要一個std::function
函數。 您的模板應該這樣做:
template< typename C, typename F >
void print_for_each( C& c, F f )
{
std::for_each( c.begin(), c.end(), f );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.