使用 C 11 模板或 lambda 函数时,了解类型推导的工作原理非常重要。如果您定义接受 std::function 或 lambda 函数的函数模板,编译器可能无法自动推导模板类型。
例如,考虑以下函数:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { set<A> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
如果您尝试直接使用 lambda 函数调用此函数,您可能会遇到错误。这是因为编译器无法单独从 lambda 函数推导出模板类型:
set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });
可以通过显式指定模板类型来避免此错误:
set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
或者,您可以将 lambda 函数转换为 std::function 对象:
std::function<bool(int)> func = [](int i) { return i%2 ==0; }; set<int> myNewSet = filter(mySet,func);
如果您需要过滤一组值基于比较函数,您可以通过创建接受 CompareFunction 类型的函数模板来提供更通用的解决方案:
template<class Value,class CompareFunction> set<Value> filter(const set<Value>& input,CompareFunction compare) { set<Value> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
以上是为什么在将 Lambda 函数与函数模板结合使用时,C 11 不推导类型?的详细内容。更多信息请关注PHP中文网其他相关文章!