测试λ 函数的一种方法:通过全局 λ 函数表,保存所有λ 函数

下面的方式,把任意的局部代码包装在λ 函数里,就地调用,同时把λ 函数保存到全局表,在外部访问。

#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;
}
posted @ 2024-05-30 20:35  ffl  阅读(8)  评论(0编辑  收藏  举报