【发布时间】:2014-05-16 16:41:36
【问题描述】:
我有以下模板声明
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
}
但是,如果我明确地转换 lambda,它就可以工作(!)
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 () )
为什么模板参数推导失败?以及如何解决?
【问题讨论】:
-
这应该可以工作,而且可能会更好... #define lmda_(...) (function
VA_ARGS)>)[&] (VA_ARGS) -> foo( lmda_(string s, bool b) { }); // 注意缺少的 () e:你需要在 va_args 前后加上 2 个下划线(它们在这里变成粗体格式的文本) -
机器人的 Lambda 平庸定律:如果您的设计关心 lambda,那就错了。 (也可以简单地表述为“lambdas are not special”)
标签: c++ templates c++11 lambda variadic-templates