首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变模板lambda参数的模板推导

可变模板lambda参数的模板推导
EN

Stack Overflow用户
提问于 2017-02-13 02:51:22
回答 1查看 298关注 0票数 6

给定以下各种模板:

代码语言:javascript
复制
template<typename... Params>
void fun(void(*f)(Params...), Params... params) {
  f(params...);
}

int main() {
  fun(+[](int a, int b) {}, 2, 3);
}

现在,当使用lambda调用fun时,我需要显式地指定所有lambda参数的类型。这似乎是多余的,因为int, int可以从2, 3中推断出来。有没有办法使它更加简洁和自动?

我想让以下几点发挥作用,但事实并非如此:

代码语言:javascript
复制
template<typename... Params>
void fun(void(*f)(Params...), Params... params) {
  f(params...);
}

int main() {
  fun(+[](auto a, auto b) {}, 2, 3);
}

我正在用g++ 5.4.0-std=c++14编译。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-13 03:07:27

通过T而不是指针来获取函数:

代码语言:javascript
复制
template<typename T, typename... Params>
void fun(T f, Params... params) {
  f(params...);
}

int main() {
  fun([](auto a, auto b) {}, 2, 3);
}

这样,编译器可以选择哪些重载是调用站点的权限,而不是在+操作符中调用。正如注释中所说的,无论如何都没有为泛型lambdas定义+操作符。

或者,您可以通过使用标识别名来禁用编译器试图从函数指针推断Params,但我并不推荐它为。不管怎样,给你:

代码语言:javascript
复制
template<typename T>
struct identity { using type = T; };

template<typename T>
using identity_t = typename identity<T>::type;

template<typename... Params>
void fun(void(*f)(identity_t<Params>...), Params... params) {
  f(params...);
}

int main() {
  //  v----- no unary +. That operator is not defined for generic lambdas.
  fun([](auto a, auto b) {}, 2, 3);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42195942

复制
相关文章

相似问题

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