使用基于策略的C++设计

使用基于策略的C++设计,c++,policy-based-design,C++,Policy Based Design,我目前的类设计是这样的,我复制了类层次结构和函数调用: Helper* HelperFactory::create(const Advice& advice, const Handler& ah) { Helper* result = 0; switch(advice.getType()) { case ONE: case TWO: { if(adv

我目前的类设计是这样的,我复制了类层次结构和函数调用:

  Helper* HelperFactory::create(const Advice& advice, const Handler& ah)
  {
       Helper* result = 0;
      switch(advice.getType())
      {
         case ONE:
         case TWO:
        {
                 if(advice.isTradeAdvice())
                      result = new SimpleHedgeHelper(advice, ah);
                 else
                     result = new SimpletradeHelper(advice, ah);
                break;
        } 
        case THREE
        case FOUR:
        case FIVE:
        {
             if(advice.isTradeAdvice())
                    result = new ComplexTradeHelper(advice, ah);
             else
                 result = new ComplexHedgeHelper(advice, ah);
            break;
        }
        case SIX:
        {
            if(!advice.getMsgID())
            {
                if(advice.isTradeAdvice())
                     result = new SimpleTradeHelper(advice, ah);
                else
                     result = new SimpleHedgeHelper(advice, ah);
            break;
             }
            else
             {
                   if(advice.isTradeAdvice())
                      result = new ComplexRateHelper(advice, ah);
                   else
                      result = new ComplexHedgeHelper(advice, ah);
                   break;
              }
       }
  } 

我试图用一些模板化的基于策略的工厂来替换这个逻辑。我之前没有基于plicly设计过任何类。有人能建议如何设计吗?

在考虑迁移到策略模板时,您应该评估是否可以使用这种方法考虑当前类之间的行为差异:

template <class Complexity_Policy, class Instrument_Policy>
class Helper : public Abstract_Helper
{
    // for any function Helper needs...
    virtual return_type f(arguments)
    {
         ...can reference Complexity_Policy and/or Instrument_Policy members for behaviours...
    }
};
当行为在很大程度上是正交的、不相关的/解耦的时,这种方法往往效果最好

如果您的所有客户端代码都希望继续使用运行时多态性,您仍然需要您的工厂,但它应该开始返回以下内容:

result = new Helper<Complexity_Policy__Simple, Instrument_Policy__Hendge>(advice, ah);
是的,我知道标识符中双下划线的标准用法。。。我确实接受这样的风险,即这将有未定义的行为,感觉实现中唯一可以想象的使用双下划线的方法是作为前缀或后缀。。。。对此问题不感兴趣,请继续讨论


您也可以选择性地直接使用模板实例化。另一种选择是,甚至不让Helper从任何基派生或拥有虚拟函数,而是使用抽象的\u Helper*get\u polympic\u访问器成员在顶部分层运行时多态性,该成员创建一个指针持有从Helper派生的类,该类转发调用/结果。

[OT]:最好返回std::unique\u ptr@TemplateRex喝杯咖啡,重新考虑一下@昆汀啊,我的错,那些该死的骆驼壳的名字。谢谢托尼的快速回复。但重构当前的类层次结构对我来说不是一个选项:我在寻找某种解决方案,之后我应该能够通过传递type来获得正确的对象,在我的例子中,type是一个枚举值,类似于Factort f;f、 创造@user1545583:这听起来一点用处都没有,因为在创建这样一个f变量的每个上下文中,您都需要每个枚举都是编译时常量,这基本上意味着您当前工厂的switch/if/else链只是为了创建一个Factort变量并使用它间接调用new。。。。