c++ - 如何制作一个接受代码块的函数
问题描述
我正在寻找一种方法来创建一个接受代码块作为参数的函数。
我在 boost 的 for-each 循环中看到了这一点,但我自己找不到办法
我已经搜索但没有找到任何东西(可能我的术语是错误的)
我想要的一个例子:
int main() {
DO_SOMETHING_FUNC(arg1, arg2, arg3) {
//Block
}
}
解决方案
这种特定的语法只能通过宏来实现。
如果可能,您应该更喜欢无宏方法,即将 lambda 传递给函数:
do_something_func(foo, bar, [&]
{
});
任何一个的最后一个参数my_for_each
都需要具有模板类型:
template <typename F> void my_for_each(/*blah, blah, */ F func)
或者它可以是std::function
。
为了得到这个精确的语法(没有;
after ),宏需要以类似or}
结尾(取决于你想如何使用代码块),所以下面的大括号成为这个控制语句的主体。for (...)
if (...)
在某些情况下,这可能不够灵活,例如,如果您正在编写范围保护。
如果您将语法更改为 have ;
after }
,事情会变得更容易。您可以将宏DO_SOMETHING_FUNC(x, y)
扩展为myHelper(x, y) ->* [&]
,其中myHelper()
返回带有重载二元运算符的对象(->*
此处使用,因为它具有最高的可用优先级)。宏后面的大括号成为 lambda 主体,重载的运算符接收所述 lambda 作为第二个参数。
推荐阅读
- html - CSS 导航栏边框
- node.js - 将具有函数的对象从一个组件传递到另一个组件(app.js 到 navbar.js)
- python - 熊猫按组填充多列
- lua - ESP8266 运行 NodeMCU - 检测脉冲流开始/停止
- javascript - 如何让 Highcharts 图例专注于其所属的图表?
- sql - 我可以将日期行转换为列而不必在数据透视中指定日期吗?甲骨文 SQL
- bash - bash 脚本错误 let:表达式中的语法错误(符号错误为 << 0:6 >> )
- python - Flask API 的问题——它只返回我尝试抓取的最后一个页面
- c# - 如何在使用 CMake 构建的 WPF 项目中使用图标文件
- go - Go OpenTelemetry - gRPC 服务器和客户端在同一服务中的相关跨度如何