在基于策略的重构中缩短模板参数
Shortening template arguments in policy based refactoring
我正在尝试使用策略重构一些代码(请参阅《现代C++设计》一书),并希望缩短或简化宿主类方法的代码。假设我已经实现了一个名为 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
现在是一个模板类,因此函数定义需要另一个说明符:
// 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() {...}
...
我认为每次新策略进入阶段时更改所有 hostclass 方法的所有说明符有点痛苦。也许使用 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() {...}
...
在脑海中。我能想到的绕过定义规范的唯一其他选择是实现一个从Hostclass
和所有其他策略继承自身的HostclassWrapper
类:
// 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 {
};
还有其他建议吗?
您可以简单地使用可变参数模板:
template <class... Policies>
class Host : public Policies... { ... }
template <class... Policies>
void Host<Policies...>::func() { ... }
避免在每个成员函数定义中重复模板声明的唯一方法是在类定义本身中定义它们。
但是,如果您支持任意数量的策略,那么可变参数模板绝对是您想要的。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- C++-将具有引用的长参数列表重构为结构
- 重构模板类,该类将其嵌套类用作另一个类的模板参数
- 重构现有包装类,以使用与包装器本身相同的构造函数参数包装 T
- 重构许多函数以优雅地接收任何类型的参数(模板<any>)
- C++ 重构采用 int 或字符串参数的方法
- 重构,其中唯一函数具有不同的参数
- 函数参数已更改:如何重构代码,尽可能少
- 使用相同的参数重构静态成员函数
- 类重构:带参数的继承
- 在基于策略的重构中缩短模板参数