You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将语句块作为参数传递给C++函数调用?

在C++中实现将语句块作为参数传递的方法

当然可以实现,C从C11开始提供了多种简洁的方式来传递语句块作为函数参数,下面是几种常用方案:

1. 使用Lambda表达式(最推荐)

Lambda是C++11引入的特性,可以直接在代码中定义匿名的可调用对象,完美适配你的需求。你可以把语句块写成lambda,直接作为参数传给函数,或者先把lambda赋值给变量再传递:

示例代码:

#include <iostream>
#include <functional>

// 用std::function定义函数参数类型,也可以用模板参数更灵活
void func(bool cond, const std::function<void()>& block_A, const std::function<void()>& block_B) {
    if(cond) {
        block_A(); // 调用语句块
    } else {
        block_B();
    }
}

int main() {
    // 将语句块赋值给变量
    auto block_A = [](){
        int y = 1;
        std::cout << y << std::endl;
        // 可以添加更多语句
    };

    auto block_B = [](){
        int z = 1;
        std::cout << z << std::endl;
        // 可以添加更多语句
    };

    // 直接传递lambda作为临时语句块也可以
    func(true, block_A, [](){
        std::cout << "这是临时定义的block_C" << std::endl;
    });
}

如果追求更高的性能,可以用模板参数代替std::function,避免类型擦除的开销:

template<typename F1, typename F2>
void func(bool cond, F1&& block_A, F2&& block_B) {
    if(cond) {
        std::forward<F1>(block_A)();
    } else {
        std::forward<F2>(block_B)();
    }
}

2. 使用函数对象(仿函数)

在C++11之前,通常会用重载operator()的结构体/类来实现类似功能,不过写法相对繁琐:

示例代码:

#include <iostream>

struct BlockA {
    void operator()() const {
        int y = 1;
        std::cout << y << std::endl;
    }
};

struct BlockB {
    void operator()() const {
        int z = 1;
        std::cout << z << std::endl;
    }
};

template<typename F1, typename F2>
void func(bool cond, F1 block_A, F2 block_B) {
    if(cond) {
        block_A();
    } else {
        block_B();
    }
}

int main() {
    func(true, BlockA(), BlockB());
}

3. 使用函数指针(局限性大)

如果语句块逻辑非常简单且没有捕获外部变量,也可以用函数指针传递,但这种方式无法捕获外部变量,灵活性很差,不推荐:

#include <iostream>

void block_A() {
    int y = 1;
    std::cout << y << std::endl;
}

void block_B() {
    int z = 1;
    std::cout << z << std::endl;
}

void func(bool cond, void (*block_A)(), void (*block_B)()) {
    if(cond) {
        block_A();
    } else {
        block_B();
    }
}

int main() {
    func(true, block_A, block_B);
}

总结一下,Lambda表达式+模板/std::function是最符合你需求的实现方式,既简洁又灵活,能完美实现你示例中传递语句块的功能。

内容的提问来源于stack exchange,提问作者Addiction99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:05:26