[英]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.