簡體   English   中英

我可以在std :: function中使用模板類型T來傳遞lambda類型函數C ++ 11嗎?

[英]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 “衰減”,在模板類型推導中,編譯器也不會執行隱式轉換。 因此,在這種情況下,編譯器會嘗試匹配兩個不兼容類型的對象,因此它會失敗。

您可能想知道為什么編譯器不執行此類隱式轉換。 這是因為通過在參數類型推導之上執行類型轉換,可以達到許多“矛盾”的情況,其中多個不兼容的類型可以是候選者。

可能的解決方案:

  1. 您可以將功能的簽名更改為

     template <typename T, typename F> void print_for_each(vector<T> v, F&& func){ std::for_each(v.begin(), v.end(), func); } 
  2. 你可以將lambda包裝在std::function並將后者傳遞給你的函數(參見@Br​​ian的評論)

  3. 您可以“幫助”編譯器並顯式指定模板類型參數

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM