如何将语句块作为参数传递给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
相关产品推荐
相关产品推荐

