装饰函数时限制代码重复
Limit code duplication when decorating a function
我对 c++ 编程还很陌生,想问一下如何以最有效的方式实现某些东西。假设我有一个 class A,它有两个函数 foo 和 bar。 Main 将实例化 A 的对象并调用 foo。这 class 做了一些计算上昂贵的事情,其中 foo 可能会调用 bar ,反之亦然,回溯等等,直到计算出一些结果。我现在想为这个 class 实现类似装饰器的东西,其中函数 bar 现在与以前一样,但在返回之前,例如,打印一些中间结果,同时保持原始实现可用于这些中间结果的情况不想要。其他一切保持不变。
我不知道我会以最好的方式实现这样的事情。我当然可以在 class A 中的 bar 末尾添加一些 if 语句并检查在 main 中设置的一些成员变量,但是由于这些函数将被调用很多,这将添加许多额外的检查,这些检查不是确实需要,因为在 main 中检查一次就足够了。我还可以创建 class A 的副本,我们称它为 B,并在那里修改 bar。但这会重复大部分代码,并且需要对 A 和 B 进行后续更改。我也可以在 A 中创建函数 bar 虚拟并让 B 从 A 派生并覆盖它,但是我只是简单地进行这些检查以调度决定的形式,不是吗?
我建议使用 bool 参数
class A{
public:
void foo(/*params*/,bool should_print=false){
if (should_print){
//print
}
}
void bar(/*params*/,bool should_print=false){
if (should_print){
//print
}
}
};
如果要打印,设置参数should_print为真,否则不传。
您也可以使用模板来标记。所以(INside class A)
template<bool should_print>
void bar(/*params*/){
if constexpr (should_print){
//print
}
}
这将在编译时评估 if ,因此它会更快,但您必须在石南花中为 class 而不是在 .cpp
[= 中定义模板函数16=]
注意 if constexpr
仅适用于 c++17
如果您使用较旧的标准,则可以使用常规 if
。任何有能力的编译器也会以这种方式评估 if 编译时
我对 c++ 编程还很陌生,想问一下如何以最有效的方式实现某些东西。假设我有一个 class A,它有两个函数 foo 和 bar。 Main 将实例化 A 的对象并调用 foo。这 class 做了一些计算上昂贵的事情,其中 foo 可能会调用 bar ,反之亦然,回溯等等,直到计算出一些结果。我现在想为这个 class 实现类似装饰器的东西,其中函数 bar 现在与以前一样,但在返回之前,例如,打印一些中间结果,同时保持原始实现可用于这些中间结果的情况不想要。其他一切保持不变。
我不知道我会以最好的方式实现这样的事情。我当然可以在 class A 中的 bar 末尾添加一些 if 语句并检查在 main 中设置的一些成员变量,但是由于这些函数将被调用很多,这将添加许多额外的检查,这些检查不是确实需要,因为在 main 中检查一次就足够了。我还可以创建 class A 的副本,我们称它为 B,并在那里修改 bar。但这会重复大部分代码,并且需要对 A 和 B 进行后续更改。我也可以在 A 中创建函数 bar 虚拟并让 B 从 A 派生并覆盖它,但是我只是简单地进行这些检查以调度决定的形式,不是吗?
我建议使用 bool 参数
class A{
public:
void foo(/*params*/,bool should_print=false){
if (should_print){
//print
}
}
void bar(/*params*/,bool should_print=false){
if (should_print){
//print
}
}
};
如果要打印,设置参数should_print为真,否则不传。
您也可以使用模板来标记。所以(INside class A)
template<bool should_print>
void bar(/*params*/){
if constexpr (should_print){
//print
}
}
这将在编译时评估 if ,因此它会更快,但您必须在石南花中为 class 而不是在 .cpp
[= 中定义模板函数16=]
注意 if constexpr
仅适用于 c++17
如果您使用较旧的标准,则可以使用常规 if
。任何有能力的编译器也会以这种方式评估 if 编译时