加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 设计算法的通用选项

发布时间:2020-12-16 10:15:23 所属栏目:百科 来源:网络整理
导读:我想知道是否有用于为一组算法指定选项的设计模式.我正在使用C. 让我来描述我的问题.我有一套算法,这些算法有不同的选择.我想设计一个单点访问这些算法.类似于策略模式的东西.此单点访问是一个控制器类,它将输入作为通用选项类.根据选项,将使用合适的算法.我
我想知道是否有用于为一组算法指定选项的设计模式.我正在使用C.
让我来描述我的问题.我有一套算法,这些算法有不同的选择.我想设计一个单点访问这些算法.类似于策略模式的东西.此单点访问是一个控制器类,它将输入作为通用选项类.根据选项,将使用合适的算法.我想概括这些选项,以便我可以扩展算法和客户端.
谢谢,
阿莫尔

解决方法

构建于 Konrad’s suggestion of using policy types,如果您的算法在构造时需要参数,您可以通过要求任何Policy类具有名为Params的嵌套类型,然后在fancy_algorithm< Policy>中提供构造函数来干净地处理它.接受此类型的参数并将其传递给包含的Policy对象:

template <typename Policy>
class fancy_algorithm : private Policy {
public:
    typedef typename Policy::Params Params;    // Need to redeclare :(

    explicit fancy_algorithm(Params params = Params()) : Policy(params) {}
};

需要将任何相关参数打包到Policy :: Params类型的单个对象中.

Policy类始终使用Policy :: Params类型的单个参数构造.要使用(可能)不需要参数的策略类,请在Params中提供默认构造函数(或使用隐式声明的构造函数),而不是在Policy中.这样,通过使用fancy_algorithm的默认值< Policy>如上所述的构造函数,我们启用了fancy_algorithm< Policy>的方便的默认构造.每当Policy :: Params有一个默认构造函数时(即当Policy不需要任何参数时).没有安全性丢失:如果Policy :: Params缺少默认构造函数(表示需要一些参数),则任何尝试默认构造fancy_algorithm< Policy>对象将在编译时失败.

例:

struct multiply_by_params {
    multiply_by_params(int x /* = 42 */) : _x(x) {}     // See bottom
    int get() const { return _x; }    // Or,just make multiply_by a friend

private:
    int _x;
};

struct multiply_by {
    typedef multiply_by_params Params;
    multiply_by(Params p) : _x(p.get()) { /* Other initialisation */ }

    // Other code implementing the strategy (e.g. an operator()())
    ...

private:
    int _x;
};

fancy_algorithm<multiply_by> a(69); // Always compiles
fancy_algorithm<multiply_by> b;     // Compiles iff /* = 42 */ is uncommented

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读