模板參數推導,我有以下模板聲明C++與lambda表達式
template<typename T>
void foo(function<void(T)> f){
// ...
};
但是,當我這樣稱呼它
foo([](string s){ });
// visual studio 13 error message =>
// Error: void foo(std::function<void(_Type)>)' :
//could not deduce template argument for 'std::function<void(_Type)>'
//from 'main::<lambda_58b8897709e10f89bb5d042645824f66>
模板參數推導失敗。 爲什麼?如何解決它?
我有可變參數模板
template<typename ... Tn>
void foo(function<void(Tn ...)> f){
// ...
};
int main() {
foo<string,bool>([](string s,bool b){ }); // Works
foo([](string s,bool b){ }); // Fails
}
同樣的問題,但是,如果我明確地轉換它的工作拉姆達(!)
foo((function<void(string,bool)>) [](string s,bool b){ }); // Works
// Or even a simpler syntax with a macro
#define lmda_(a) (function<void a>)[&] a
foo(lmda_((string s, bool b)) { }); // Works (note the extra())
爲什麼模板參數推導失敗?以及如何解決它?
http://stackoverflow.com/q/11500881/560648 –
這應該工作,並且可能是更好... 的#define lmda_(......)(函數<空隙(__VA_ARGS __)>)[&](__VA_ARGS__) - > foo(lmda_(string s,bool b){}); e:你需要使用兩個下劃線前後綴va_args(它們在這裏變成粗體格式文本) – Shaggi
*機器人的Lambda平庸定律*:如果你的設計關心lambda表達式,那就錯了。 (也簡稱爲「lambda不是特別的」) –