c – 使用宏替换重复出现的代码块,略有不同
发布时间:2020-12-16 10:08:09 所属栏目:百科 来源:网络整理
导读:在我的源文件中,我有几个代码块,它们有很长的重复出现的部分.以此块为例: void MemberFunctionBar([..],SomeClass param,[..]) { /* long common part */ if constexpr (SafeCopy) { T copyOfParam(param); /* many lines of code */ Foo(std::move(copyOfP
在我的源文件中,我有几个代码块,它们有很长的重复出现的部分.以此块为例:
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 */ }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读