【发布时间】:2019-06-05 13:38:49
【问题描述】:
我想创建一个可以包装任何 lambda 以记录开始/结束调用的函数。
下面的代码可以工作,除了:
任何具有捕获功能的 lambda
任何返回 void 的 lambda(尽管这可以通过编写第二个函数轻松解决)
#include <iostream>
#include <functional>
template <class T, class... Inputs>
auto logLambda(T lambda) {
return [&lambda](Inputs...inputs) {
std::cout << "STARTING " << std::endl;
auto result = lambda(inputs...);
std::cout << "END " << std::endl;
return result;
};
}
int main() {
int a = 1;
int b = 2;
// works
auto simple = []() -> int {
std::cout << "Hello" << std::endl; return 1;
};
logLambda(simple)();
// works so long as explicit type is declared
auto with_args = [](int a, int b) -> int {
std::cout << "A: " << a << " B: " << b << std::endl;
return 1;
};
logLambda<int(int, int), int, int>(with_args)(a, b);
// Does not work
// error: no matching function for call to ‘logLambda<int(int), int>(main()::<lambda(int)>&)’
auto with_captures = [&a](int b) -> int {
std::cout << "A: " << a << " B: " << b << std::endl;
return 1;
};
logLambda<int(int), int>(with_captures)(b);
}
有没有办法做到这一点?宏也可以接受
【问题讨论】:
-
您收到代码错误?请在问题中包含它
-
你想重塑
std::function吗? -
你的代码有UB。您通过引用捕获函数局部变量
lambda并将其返回。而是按值捕获。