在修饰函数时限制代码重复



我对c++编程相当陌生,想问一下如何以最有效的方式实现某些东西。假设a类有两个函数foo和bar。Main将实例化A的一个对象并调用foo。这个类做了一些计算成本很高的事情,其中foo可能调用bar,反之亦然,回溯等等,直到计算出某个结果。我现在想实现像这个类的装饰器一样的东西,其中功能栏现在与以前一样,但在返回之前,例如,打印一些中间结果,同时保持原始实现可用于这些中间结果不需要的情况。

我想知道我会以最好的方式实现这样的东西。当然,我可以在类A的bar的末尾添加一些if语句,并检查在main中设置的一些成员变量,但由于这些函数将被多次调用,这将增加许多实际上不需要的额外检查,因为在main中进行一次检查就足够了。我也可以创建一个类a的副本,我们称它为B,并修改这里的bar。但这将复制大部分代码,并要求随后对A和B进行更改。我也可以将A中的功能栏设置为虚拟,并让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设置为true,否则不要传递。

你也可以使用template for flag。so (INside class A)

template<bool should_print>
void bar(/*params*/){
if constexpr (should_print){
//print
}
}

这将在编译时计算if,因此它将更快,但您必须在heather中为类定义模板函数,而不是在它的.cpp

注意if constexpr只能从c++17工作,如果您使用旧的标准,您可以有一个常规的if。任何有能力的编译器也会这样计算if编译时

最新更新