【发布时间】:2014-06-02 22:38:58
【问题描述】:
我的代码如下:
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)(...etc)(..Etc.);
那我可以叫它(this->(mCashFlowProcs [cmd]))();
如何将其转换为模板以便重复使用?这个实现会不会有问题?
请注意,我没有使用 C++11
【问题讨论】:
-
boost::unordered_map<cmd_enum, boost::function<void()>>? -
虽然我可能只使用普通表。
-
我不明白的是“如何将其变成模板以便可以重复使用”?你在这里问什么?您想在
CashflowProcs类型上模板化这个概念吗? -
@MooingDuck 这看起来是三个间接加上散列减去内联和潜在的缓存未命中 o.O
-
@dyp 好吧,这取决于数组或映射(或向量)是否是更/最优雅的方式,但映射会更具动态性。例如,如果 OP 想通过某种运行时机制(可能在将来)添加命令,则不能使用数组。而且我对这个问题思考得越多,我就越认为如果函数集或多或少是静态的,并且你只需在代码中列出它们一次,那么一个好的旧开关是最优雅的方式。但 OP 询问了替代方案。