我正在阅读this章,我无法得到设计,我只是理解我们想以某种方式逃避填写一些默认参数参数,即
template< typename T=int , typename V = float> struct foo;
foo</*evade first type argument, */ char> ha;
这整句话也让我感到不安,因为我猜我没有得到完整的东西:
我们的技术包括将默认类型值放在基础中 类并通过派生覆盖其中的一些。代替 直接指定类型参数,我们通过帮助器提供它们 类。例如,我们可以写
BreadSlicer<Policy3_is<Custom> >
。 因为每个模板参数都可以描述任何策略,所以 默认值不能不同。换句话说,每个人都处于高水平 模板参数等效...................
是的我无法理解已经解释的事情:(。请帮助我理解所有事情是如何整合在一起的。谢谢
答案 0 :(得分:4)
如果我正确理解了这个问题,你就会问整体设计是如何运作的。 要解决的问题是能够为其中一个模板参数提供值,而不必为所有先前的参数提供它。解决方案是将类型从模板的参数移动到基类中的typedef,然后使用修改模板的参数屏蔽某些特定的typedef。
在一些简短的伪代码中,用户说:
X< default1, default2, override3 > // forced to provide default1 and default2!
我们希望她说:
X< modifyArgument3With< override3 > >
他们提出的解决方案是创建一个类型层次结构,其中基数保存默认值:
struct DefaultPolicies {
typedef Default1 P1;
...
typedef DefaultN PN;
};
然后通过继承屏蔽基类型。考虑手动定义派生类型MyPolicies
的简单性,如:
struct MyPolicies : DefaultPolicies {
typedef OverrideX PX;
typedef OverrideY PY;
};
如果您执行:MyPolicies::PX
或MyPolicies::PY
,您将获得覆盖,但对于任何其他类型PN
,您将获得在基类中定义的默认类型。
现在你需要的是能够自动构建MyPolicies
等价物。为此,他们构建了一个具有虚拟继承的并行类型层次结构来创建PolicySelector
(相当于MyPolicies
)。我相信这也可以通过线性层次结构完成(这是Alexandrescu在 Modern C ++ Design 中提供的解决方案类型),但这需要使用添加额外代码的类型列表。在C ++ 11中,使用可变参数模板参数,线性层次结构变得更加简单,但在C ++ 98中,您只需编写一些内容就可以支持列表。