c – 使用宏替换重复出现的代码块,略有不同

c – 使用宏替换重复出现的代码块,略有不同,第1张

概述在我的源文件中,我有几个代码块,它们有很长的重复出现的部分.以此块为例: void MemberFunctionBar([..], SomeClass param, [..]) { /* long common part */ if constexpr (SafeCopy) { T copyOfParam(param); /* many line @H_419_1@ 在我的源文件中,我有几个代码块,它们有很长的重复出现的部分.以此块为例:

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);    }}

现在我想将这些中间行只写一次,以获得更好的代码可维护性.此外,由于限制,不能进行进一步的功能调用.如果可能,代码应扩展为原始格式.

到目前为止,我正在考虑像这个宏(显然不起作用,因为宏中的预处理器指令不被解释):

#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([..],[..]) {    /* long common part */    IF_SAFE_copY_copY_ParaM({        /* many lines of code */        Foo(__the_param__);    })}

即使有限制(没有额外的函数调用),我仍然愿意接受建议.

解决方法 您可以使用更高阶的函数:

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);    }}

用法:

MemberFunctionbar(my_param,[](/*...*/){ /* block of code */ });
总结

以上是内存溢出为你收集整理的c – 使用宏替换重复出现的代码块,略有不同全部内容,希望文章能够帮你解决c – 使用宏替换重复出现的代码块,略有不同所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存