gpt4 book ai didi

c++:使用模板将任何lambda包装在另一个lambda中

转载 作者:太空宇宙 更新时间:2023-11-04 15:11:45 24 4
gpt4 key购买 nike

我想制作一个可以包装任何 lambda 的函数,以记录对其的开始/结束调用。

以下代码有效,除了:

  1. 任何具有捕获的 lambda

  2. 任何返回 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);

}

有什么办法吗?宏也是可以接受的

最佳答案

使用 Raii 来处理 void 和非 void 返回类型,
并按值捕获仿函数以避免悬空引用,
并使用通用 lambda 来避免必须自己指定参数

结果是这样的:

template <class F>
auto logLambda(F f) {
return [f](auto... args) -> decltype(f(args...)) {
struct RAII {
RAII() { std::cout << "STARTING " << std::endl; }
~RAII() { std::cout << "END " << std::endl; }
} raii;

return f(args...);
};
}

调用看起来像:

const char* hello = "Hello";
logLambda([=](const char* s){ std::cout << hello << " " << s << std::endl; })("world");

Demo

关于c++:使用模板将任何lambda包装在另一个lambda中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56461665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com