【发布时间】:2020-02-19 19:41:47
【问题描述】:
您好,我正在尝试使用以下代码解决问题:
template<typename... Args>
using Func = void (*)(Args... args);
template<typename... Args>
void do_test(Func<Args&...> f, Args&... args) {
for (int i = 0; i != 100; i++)
f(args...);
}
int main(){
int x = 0;
do_test(Func<int&>([](int &y) { y++; }), x); // OK
// Error - mismatched types 'void (*)(Args& ...)' and 'main()::<lambda(int&)>'
do_test([](int &y) { y++; }, x);
return x;
}
谁能解释为什么有必要将 lambda 包装在 Func<int&>( ) 中?有没有办法避免它? - 因为如果参数列表不平凡,必须列出两次参数类型变得非常乏味。
这里的目标是创建一个编译器可以优化掉的访问者模式。我将它用于图像处理算法,我想重用外部循环的代码,以及各种内部代码。 Args 被用作类似于 lambda 捕获的东西,除了使用传统的函数指针以便编译器可以优化它们之外 - 这似乎无法使用 std::function<>
【问题讨论】:
-
黑魔法:添加
+。示例:do_test(+[](int &y) { y++; }, x);. -
@FrançoisAndrieux - 什么?太疯狂了。所以在函数指针上做一些整数/指针数学运算,在编译器眼中去掉它的 lamda-ness?
-
无捕获 lambda 可转换为函数指针。使用
+会强制进行转换。我不确定的是为什么do_test不会自动使用这种转换。通常,这表明涉及的两个隐式转换太多了,但我不知道它到底是什么。所以我不确定为什么 not 使用+不起作用。
标签: c++ templates lambda variadic