gpt4 book ai didi

c++ - 使用宏替换具有细微差异的重复代码块

转载 作者:太空狗 更新时间:2023-10-29 20:09:23 28 4
gpt4 key购买 nike

在我的源文件中,我有几个代码块,其中有很长的重复部分。以这个 block 为例:

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

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

最佳答案

您可以使用高阶函数:

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++ - 使用宏替换具有细微差异的重复代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46662635/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com