首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将lambda作为模板函数参数传递

将lambda作为模板函数参数传递
EN

Stack Overflow用户
提问于 2017-01-29 20:28:35
回答 4查看 3.8K关注 0票数 17

为什么下面的代码不能编译(在C++11模式下)?

代码语言:javascript
复制
#include <vector>

template<typename From, typename To>
void qux(const std::vector<From>&, To (&)(const From&)) { }

struct T { };

void foo(const std::vector<T>& ts) {
    qux(ts, [](const T&) { return 42; });
}

错误消息为:

代码语言:javascript
复制
prog.cc:9:5: error: no matching function for call to 'qux'
    qux(ts, [](const T&) { return 42; });
    ^~~
prog.cc:4:6: note: candidate template ignored: could not match 'To (const From &)' against '(lambda at prog.cc:9:13)'
void qux(const std::vector<From>&, To (&)(const From&)) { }
     ^

但它不能解释为什么它不能匹配参数。

如果我让qux成为一个非模板函数,用T替换From,用int替换To,它就会编译。

EN

回答 4

Stack Overflow用户

发布于 2017-01-29 20:49:49

如果不需要使用推导出的To类型,可以直接推导出整个参数的类型:

代码语言:javascript
复制
template<typename From, typename F>
void qux(const std::vector<From>&, const F&) { }
票数 10
EN

Stack Overflow用户

发布于 2017-01-29 20:50:14

如果我错了,请纠正我,但是模板参数推导只推导出确切的类型,而不考虑可能的转换。

因此,编译器无法推导出To (&)(const From&)ToFrom,因为qux需要一个对函数的引用,但您提供了一个具有自己类型的lambda。

票数 6
EN

Stack Overflow用户

发布于 2017-01-29 20:52:24

你完全没有机会让编译器去猜测什么是To。因此,您需要显式地指定它。

另外,这里的lambda需要通过指针传递。

最后,这个版本可以正常编译:

代码语言:javascript
复制
template<typename From, typename To>
void qux(const std::vector<From>&, To (*)(const From&)) { }

struct T { };

void foo(const std::vector<T>& ts) {
    qux<T,int>(ts,[](const T&) { return 42; });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41920890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档