可变参数模板 lambda 参数的模板推导
Template deduction for variadic template lambda arguments
给定以下可变参数模板:
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);
}
给定以下可变参数模板:
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);
}