下面的方式,把任意的局部代码包装在λ 函数里,就地调用,同时把λ 函数保存到全局表,在外部访问。
#include <iostream>
#include <vector>
#include <functional>
#include <map>
#include <any>
// 全局的 map,用于保存 foo 函数内部的 lambda 函数
std::map<std::string, std::any> lambdaMap;
// 定义宏,用于在 foo 函数中插入 lambda 测试代码
#define LAMBDA_TEST_BEGIN(name, params) \
auto lambda_##name = [&](params) {
#define LAMBDA_TEST_END(name, args) \
}; \
lambdaMap[#name] = lambda_##name;
void foo() {
// 容器
std::vector<int> container = {1, 2, 3, 4, 5};
// 在原始 while 循环的前后分别插入宏定义
LAMBDA_TEST_BEGIN(while, std::vector<int>& vec)
// 只有当容器非空时才执行逻辑
while (!vec.empty()) {
// 在容器非空时的逻辑
std::cout << "容器不为空,大小为 " << vec.size() << std::endl;
// 在这里可以添加更多逻辑
// ...
vec.pop_back(); // 为了避免无限循环,这里简单地从容器中删除最后一个元素
}
// 容器为空时的逻辑
std::cout << "容器为空" << std::endl;
LAMBDA_TEST_END(while, container)
}
int main() {
foo(); // 调用 foo 函数
// 在 main 函数中测试 lambda 函数的逻辑
std::vector<int> emptyContainer;
std::vector<int> nonEmptyContainer = {1, 2, 3};
// 测试容器为空时的逻辑
std::cout << "测试容器为空时的逻辑:" << std::endl;
std::any_cast<std::function<void(std::vector<int>&)>>(lambdaMap["while"])(emptyContainer);
std::cout << std::endl;
// 测试容器非空时的逻辑
std::cout << "测试容器非空时的逻辑:" << std::endl;
std::any_cast<std::function<void(std::vector<int>&)>>(lambdaMap["while"])(nonEmptyContainer);
return 0;
}
标签:std,lambdaMap,函数,while,测试,全局,include,name
From: https://www.cnblogs.com/math/p/18223178/a-method-2-test-lambda-f