在我的源文件中,我有几个代码块,它们有长时间重复出现的部分。以这个街区为例:
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([..], SomeClass param, [..]) {
/* long common part */
IF_SAFE_COPY_COPY_PARAM({
/* many lines of code */
Foo(__the_param__);
})
}即使有限制(没有额外的函数调用),我仍然愿意听取建议。
发布于 2017-10-10 09:05:50
您可以使用高阶函数:
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 */ });https://stackoverflow.com/questions/46662635
复制相似问题