首页 > 解决方案 > 如何制作一个接受代码块的函数

问题描述

我正在寻找一种方法来创建一个接受代码块作为参数的函数。

我在 boost 的 for-each 循环中看到了这一点,但我自己找不到办法

我已经搜索但没有找到任何东西(可能我的术语是错误的)

我想要的一个例子:

int main() {
    DO_SOMETHING_FUNC(arg1, arg2, arg3) {
        //Block
    }
}

标签: c++

解决方案


这种特定的语法只能通过宏来实现。

如果可能,您应该更喜欢无宏方法,即将 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 作为第二个参数。


推荐阅读