在开关情况下实现函数调用的其他方法
other way of implementing function calls in switch cases
我的代码如下:
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::
。
相关文章:
- 还有其他方法可以在数组中写入多维数组吗?
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- Unity3d 中还有其他方法可以访问设备相机吗?
- Sizeof返回的是指针大小,而不是数组大小.有其他方法可以找到尺寸吗
- 还有其他方法可以为乘法表编写循环以获取运行时值吗?
- 是否有其他方法将.dll文件从一个项目复制到我的启动项目中的可执行文件旁边
- 当从其他方法返回 vector 时,C++无法访问矢量元素
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- 有没有其他方法可以将地址分配给指针变量
- 如何将策略模式与派生类中的其他方法一起使用
- C++基础知识(使用其他方法(Unicode?)的相同代码)
- 成员函数模板推演指南或其他方法让编译器知道如何调用函数
- 如何在类中的其他方法中访问私有数据成员 2D 数组
- 如何确保类的每个方法都首先调用其他方法
- 如果派生类包含其他方法和成员,则可以static_cast从基类到派生类
- 我们还能使用任何其他方法来访问Android中的C 代码,而不是使用JNI访问C 代码
- Qt QNetworkAccessManager 或其他方法获取 html 状态代码而不获取页面 contenet
- extern可以解决这个问题吗,或者我可以通过其他方法解决这个问题吗?
- 使用来自其他方法和 #define 的函数定义常量
- 在其他方法之前运行的C 类方法