c++ - 可变参数模板 lambda 参数的模板推导

标签 c++ templates lambda generic-lambda

给定以下可变参数模板:

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 推导出来。有没有办法让它更简洁和自动化?

我希望下面的方法起作用,但它不起作用:

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 进行编译。

最佳答案

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

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

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

那样的话,如果在 + 运算符内,编译器可以选择在调用点调用哪个重载。正如评论中所说,无论如何都没有为通用 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);
}

关于c++ - 可变参数模板 lambda 参数的模板推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195942/

相关文章:

c++ - 从给定的符号、尾数和指数构造 float ( double )的宏或函数?

c++ - 使用函数指针作为模板方法的默认参数时出错

c++ - 我使用 C++ 标准库的 find 有什么问题?

python - 使用 pygame 和 lambda 实现撤消和重做

java - 可选获取值(如果存在)

c++ - 如何在 C++ 中删除文件夹?

c++ - OpenCV 根据图像集检测图像

c++ - 从 Qt 中的对话框声明指向主窗口的指针

c++ - 可选地下降嵌套结构

java - Lambda 将文件输入到数组中