缩短基于策略的重构中的模板参数

时间:2016-03-15 12:28:21

标签: c++ templates c++11 c++14 policy

我正在尝试使用策略重构一些代码(请参阅书籍Modern C++ Design),并希望缩短或简化主机类方法的代码。我们假设我已经实现了一个名为Hostclass的类:

// Hostclass header, start version
struct Hostclass {
    void Hostfct1();
    void Hostfct2();
    ...
};
// method definitions, start version
void
Hostclass::Hostfct1(){...}

void
Hostclass::Hostfct2(){...}
...

现在我有一个政策类

struct Policy1class {
    void Policy1fct(){};
};

并希望将Policy1class注入Hostclass。这意味着我必须更改Hostclass的标题:

// Hostclass header, second version
template <typename Policy1>
struct Hostclass : public Policy1 {

但这些方法呢? Hostclass现在是一个模板类,因此函数definitons需要另一个说明符:

// method definitions, second version
template <typename Policy1>
void
Hostclass<Policy1>::Hostfct() {...}
...

现在我想用另一个政策进一步丰富Hostclass

struct Policy2class {
    void Policy2fct(){};
};

所以我必须再次更改标题:

// Hostclass header, third version
template <typename Policy1, typename Policy2>
struct Hostclass : public Policy1, Policy2 {

以及说明符:

// method definitions, third version
template <typename Policy1, typename Policy2>
void
Hostclass<Policy1,Policy2>::Hostfct() {...}
...

我认为每当新策略进入阶段时,更改所有主机类方法的所有说明符都是屁股中的痛苦是否可能,可能使用C ++ 14的新工具及其模板别名或extern template来简化此方法定义?我有类似这样的内容

// invalid code
class P1;
class P2;
using H = Hostclass<P1,P2>;
// method definitions, dream version
void
H::Hostfct1() {...}

void
H::Hostfct2() {...}
...
记住。我可以想到绕过定义规范的唯一另一个选择是实现一个HostclassWrapper类,它继承自Hostclass和所有其他策略:

// Hostclass header, start version
struct Hostclass {...};
// method definitions, start version
void
Hostclass::Hostfct1(){...}
// new wrapper class
template <typename Policy1, typename Policy2>
class HostclassWrapper : public Hostclass, Policy1, Policy2 {
};

还有其他建议吗?

1 个答案:

答案 0 :(得分:5)

您可以简单地使用可变参数模板:

template <class... Policies>
class Host : public Policies... { ... }

template <class... Policies>
void Host<Policies...>::func() { ... }

避免在每个成员函数定义中重复模板声明的唯一方法是在类定义本身中定义它们。

但如果您支持一些任意数量的策略,那么可变参数模板绝对是您想要的。