簡體   English   中英

C ++ lambda表達式作為函數模板中的參數

[英]C++ lambda expression as an argument in function template

我需要定義一個接受集合的函數和一個函數作為輸入,以進行漂亮的集合打印。 為此,我想明確指定函數的類型,以便編譯器可以遞歸匹配,從而實現簽名

template<typename T, PrettyPrinter>
std::string to_string(const std::set<T>& set, PrettyPrinter printer);

不夠精確,因為編譯器無法推斷所需的函數對象的類型。 因此,我想使用顯式輸入

template<typename T>
std::string PrettyPrinting::to_string(const std::set<T>& set, std::function<std::string(const T&)> printer){
    const char* separator = ", ";
    const char* leftDelimiter = "{";
    const char* rightDelimiter = "}" 

    std::string output = leftDelimiter;
    if(set.begin() == set.end()) return output + rightDelimiter;

    typename std::set<T>::const_iterator it = set.begin();
    output += printer(*it);
    for(++it; it != set.end(); it++) output.append(separator) += printer(*it);

    return output + rightDelimiter;
}

這符合我的期望。 但是,我不能在另一個模板構造中使用lamba表達式

std::string to_string(const std::set<std::string>& set){
    return to_string(set, [](const std::string& input){ return input; });
}

我收到一些奇怪的錯誤,即lambda函數不適合作為參數。 另一方面,以下代碼有效

inline std::string to_string(const std::set<std::string>& set){
   std::function<std::string(const std::string&)> printer = [](const std::string& input){ return input; };
   return to_string(set, printer);
}

是否有任何合理的原因,為什么編譯器需要顯式的函數對象? 我應該指定什么類型,以便可以直接將lambda表達式寫為函數參數?

Lambda和std::function<...>是兩種不同的類型。 模板參數推導不關心隱式轉換。 嘗試這個:

template<typename T, typename PrintLambda, typename = std::enable_if_t<std::is_convertible<PrintLambda, std::function<std::string(const T&)> >::value >>
std::string PrettyPrinting::to_string(const std::set<T>& set, PrintLambda printer);

上面通過檢查PrintLambda是否可以轉換為適當的std::function來確保其具有正確的簽名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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