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.