首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用宏替换重复出现的代码块。

使用宏替换重复出现的代码块。
EN

Stack Overflow用户
提问于 2017-10-10 09:01:49
回答 1查看 220关注 0票数 3

在我的源文件中,我有几个代码块,它们有长时间重复出现的部分。以这个街区为例:

代码语言:javascript
复制
void MemberFunctionBar([..], SomeClass param, [..]) {
    /* long common part */

    if constexpr (SafeCopy) {
        T copyOfParam(param);

        /* many lines of code */
        Foo(std::move(copyOfParam));
    } else {
        /* many lines of code (exactly the same as above) */
        Foo(param);
    }
}

现在,为了获得更好的代码可维护性,我希望只编写一次这些中间行。此外,由于限制,不能进行进一步的函数调用。如果可能的话,代码应该扩展到原始表单中。

到目前为止,我考虑的是类似于这个宏的东西(这显然不起作用,因为宏中的预处理指令没有被解释):

代码语言:javascript
复制
#define IF_SAFE_COPY_COPY_PARAM(block)                \
    if constexpr (SafeCopy) {                         \
        T paramCopy(param);                           \
        #define __the_param__ std::move(paramCopy)    \
        block                                         \
        #undef __the_param__                          \
    } else {                                          \
        #define __the_param__ param                   \
        block                                         \
        #undef __the_param__                          \
    }

void MemberFunctionBar([..], SomeClass param, [..]) {
    /* long common part */
    IF_SAFE_COPY_COPY_PARAM({
        /* many lines of code */
        Foo(__the_param__);
    })
}

即使有限制(没有额外的函数调用),我仍然愿意听取建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-10 09:05:50

您可以使用高阶函数:

代码语言:javascript
复制
template <typename F>
void MemberFunctionBar( SomeClass param, F&& f) {
    if constexpr (SafeCopy) {
        T copyOfParam(param);

        std::forward<F>(f)(/*...*/);
        Foo(std::move(copyOfParam));
    } else {
        std::forward<F>(f)(/*...*/);
        Foo(param);
    }
}

用法:

代码语言:javascript
复制
MemberFunctionBar(my_param, [](/*...*/){ /* block of code */ });
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46662635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档