在开关情况下实现函数调用的其他方法

other way of implementing function calls in switch cases

本文关键字:其他 方法 函数调用 实现 开关 情况下      更新时间:2023-10-16

我的代码如下:

void CashFlow::execute (int cmd)
{
    switch(cmd):
    {
        case BUY:
            BuyProc ();
            break;
        case SELL:
            SellProc ();
            break;
         ......
    }
}

我想做的是创建一个像std::map <int, void (CashFlow::*)()> CashflowProcs;这样的地图

然后可能使用mCashFlowProcs = boost::assign::map_list_of (BUY, &CashFlow::BuyProc)(…等)(..等);

我可以把它叫做(this->(mCashFlowProcs [cmd]))();

我如何把它变成模板,以便它可以被重用?这个实现会有问题吗?

注意我没有使用c++ 11

这个实现会有问题吗?

是的,它很难维护,因为添加/删除Command需要大量的维护,容易出错,而且难以测试。因此,我建议在尝试改进这段特定代码之前进行设计更改。

1 -如果你可以改变你的设计:

class表示命令

class Command
{
    public:
        virtual void Execute() = 0;
        virtual ~Command() {};;
};
class BuyCommand : public Command
{
    public:
        virtual void Execute() { cout << "BUY"; }
};
class SellCommand : public Command
{
    public:
        virtual void Execute() { cout << "SELL"; }
};
// ...
Command* bc = new BuyCommand();
// ...
bc->Execute();

2 -如果(不幸的是)你不能这样改变设计

如果cmd枚举在编译时已知,并且具有有限的大小,则可以使用boost::function数组,并且应该在enum中重新组合命令,而不是使用int

enum { BUY = 0; SELL = 1; NB_CMDS= 2 };
...
boost::array<NB_CMDS, boost::function<void()>>  // N is the number of commands.

索引你的数组,cmd,你只需调用函数有索引cmd在这个数组。

如果在编译时不知道需要多少命令/函数,则可能需要将数组替换为std::vector

如果有一天你可以使用c++ 11,用std::代替上面代码片段中的boost::

相关文章: