Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;-在交换机情况下实现函数调用的其他方法_C++_Templates_Boost_Stl - Fatal编程技术网

C++ c++;-在交换机情况下实现函数调用的其他方法

C++ c++;-在交换机情况下实现函数调用的其他方法,c++,templates,boost,stl,C++,Templates,Boost,Stl,我有以下代码: void CashFlow::execute (int cmd) { switch(cmd): { case BUY: BuyProc (); break; case SELL: SellProc (); break; ...... } } 我想做的是创建一个像std::map CashflowProcs 然后

我有以下代码:

void CashFlow::execute (int cmd)
{
    switch(cmd):
    {
        case BUY:
            BuyProc ();
            break;
        case SELL:
            SellProc ();
            break;
         ......
    }
}
我想做的是创建一个像
std::map CashflowProcs

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

然后我可以像
(this->(mCashFlowProcs[cmd]))那样调用它(

如何将其转换为模板,以便重用?这个实现可能会有问题吗

请注意,我没有使用C++11

这个实现可能会有问题吗

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

1-如果您可以更改您的设计:

使用
表示命令

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();
使用cmd为数组编制索引,只需调用在该数组中具有索引
cmd
的函数

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


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

boost::unordered\u map
?虽然我可能只会使用一个常规表。但我不明白的是“如何将其转换为模板以便重用”?你在问什么?你想在
CashflowProcs
类型上模板化这个概念吗?@MooingDuck看起来像是三个间接加上散列减去内联和潜在的缓存未命中。O@dyp嗯,这取决于数组或映射(或者向量)是否是更优雅的方式,但映射将更具动态性。例如,如果OP希望通过某种运行时机制(可能在将来)添加命令,则不能使用数组。我越是思考这个问题,我就越觉得如果函数集或多或少是静态的,并且只需在代码中列出一次,那么一个好的旧开关是最优雅的方式。但OP询问了其他选择。看起来改变设计是最好的。
enum { BUY = 0; SELL = 1; NB_CMDS= 2 };
...
boost::array<NB_CMDS, boost::function<void()>>  // N is the number of commands.