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

Mar*_*ról 6 c++ lambda templates generic-lambda

给出以下可变参数模板:

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

int main() {
  fun(+[](int a, int b) {}, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)

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

我想以下工作,但它没有:

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

int main() {
  fun(+[](auto a, auto b) {}, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*cot 4

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

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

int main() {
  fun([](auto a, auto b) {}, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)

这样,编译器就可以选择在调用站点调用哪个重载,而不是在+运算符内部调用。正如评论中所述,无论如何都没有+为通用 lambda 定义运算符。


Params或者,您可以禁止编译器尝试使用身份别名从函数指针推导,但我真的不推荐这样做。无论如何,给你:

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);
}
Run Code Online (Sandbox Code Playgroud)