我希望在使用lambdas時自動扣除接受函數的模板函數的參數。這個例子說明我的一些選項:VS2012在使用+ [] {}巫術時抱怨
template <class T>
void foo(void (*func)(T)) {
T val;
// do something with val and func...
}
int main() {
auto pfunc0 = [] (int) { /*...*/ };
void (*pfunc1)(int) = [] (int) { /*...*/ };
auto* pfunc2 = +[] (int) { /*...*/ };
foo(pfunc0); // not ok
foo<int>(pfunc0); // ok, but redundant
foo(pfunc1); // ok, but redundant
foo(pfunc2); // ok
}
pfunc2使用一招我在這裏學到:Obtaining function pointer to lambda?。所以實際上我應該對pfunc2的情況感到滿意,因爲它是簡潔且不重複的代碼,不幸的是Visual C++ 2012 IDE抱怨它是錯誤的代碼,即使它編譯得很好。
是否有針對此問題的任何解決方法或建議?
IDE錯誤信息:
在 「自動* pfunc2」 行:IDE強調 '自動',並說
Error: cannot deduce 'auto' type
也是它強調 '[' 的地方抱怨
Error: more than one conversion function from "lambda[]void (int)->void" to a build-in type applies: function "lambda[]void (int)->void::operator void (*)(int)() const" function "lambda[]void (int)->void::operator void (*)(int)() const" function "lambda[]void (int)->void::operator void (*)(int)() const"
我沒有獲得VS2012,但你嘗試過'富(+ pfunc0);'? – krzaq
@krzaq我用錯誤消息更新了我的問題。我嘗試了你的建議,但它沒有改變任何東西(相同的錯誤信息)。 – testman
@testman我不好,我完全錯過了! – Quentin