装饰函数时限制代码重复

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 编译时