我有一个类,其成员 itemType 仅设置一次且从未修改过,但它在许多 if 语句中用于决定调用哪个函数。
由于 itemType 仅设置一次,因此可以避免在类中的其他地方使用 if 语句。这将简化和清理代码,而且还可以节省 if 检查的开销。
我在考虑函数是一个指针,我可以根据 itemType 值在构造函数中初始化。
有没有其他替代方法和更好的方法来做到这一点?

请注意原始类和代码库很大,我无法根据项目类型创建子类。

enum ItemTypes
{
    ItemTypeA,
    ItemTypeB,
};


class ItemProcessing
{
public:

    //This function is called hundreds of times
    void ProcessOrder(Order* order)
    {
        //This member itemType is set only once in the constructor and never modified again
        //Is there a way to not check it all the time??
        if (itemtype == ItemTypes::ItemTypeA )
        {
            ProcessTypeA(order)
        }
        else if (itemtype == ItemTypes::ItemTypeB )
        {
            ProcessTypeB(order)
        }
    }

    ItemProcessing(ItemTypes itype)
    {
        itemtype = itype; //can  I do something here like setting a function pointer so I dont have to check this property in ProcessOrder() and call the relevant function directly.
    }

private:

    ItemTypes itemtype;
    void ProcessTypeA(Order*);
    void ProcessTypeB(Order*);
};

最佳答案

使用由 itemtype 索引的函数指针数组,如下所示:

typedef void(*ProcessType_func_t)(Order *);

ProcessType_func_t processType_f[] = {
    ProcessTypeA,
    ProcessTypeB
};

然后你可以这样做:
void ProcessOrder(Order *order) {
    ProcessType_f[itemtype](order);
}

如果你有很多不同的函数需要像这样调度,你可以使用结构。
struct {
    ProcessType_func_t processType_f,
    OtherType_func_t otherType_f,
    ...
} dispatchTable[] = {
    { ProcessTypeA, OtherTypeA, ... },
    { ProcessTypeB, OtherTypeB, ... }
};

然后你可以将它用作:
dispatchTable[itemtype].processType_f(order);

最后,您可以通过定义新类来实现完全面向对象的方法:
class Processor { // abstract base class
    public:
        virtual void Process(Order *order) = 0;
};

class ProcessorA {
    public:
        void Process(Order *order) {
            ProcessTypeA(order);
        }
}


class ProcessorB {
    public:
        void Process(Order *order) {
            ProcessTypeB(order);
        }
}

然后你可以有一个成员变量
Processor *processor;

并在设置 itemtype 时对其进行初始化
ItemProcessing(ItemTypes itype)
{
    itemtype = itype;
    if (itemtype == ItemTypeA) {
        processor = new ProcessorA;
    } else {
        processor = new ProcessorB;
    }
}

那么你可以将它用作:
processor->Process(order);

这很容易扩展以支持更多需要在 itemtype 上调度的函数——它们都成为类中的方法。

我希望我的语法正确,我自己实际上并没有做太多的 C++ OO 编程。

关于c++ - 避免在静态 bool 值上使用 if 语句进行逻辑决策,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34455930/

10-12 00:27