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.
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)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |