需要帮助了解设计"命名模板参数"

时间:2012-04-03 15:29:00

标签: c++ templates

我正在阅读this章,我无法得到设计,我只是理解我们想以某种方式逃避填写一些默认参数参数,即

template< typename T=int , typename V = float> struct foo;
foo</*evade first type argument, */ char> ha;

这整句话也让我感到不安,因为我猜我没有得到完整的东西:

  

我们的技术包括将默认类型值放在基础中   类并通过派生覆盖其中的一些。代替   直接指定类型参数,我们通过帮助器提供它们   类。例如,我们可以写BreadSlicer<Policy3_is<Custom> >。   因为每个模板参数都可以描述任何策略,所以   默认值不能不同。换句话说,每个人都处于高水平   模板参数等效...................

是的我无法理解已经解释的事情:(。请帮助我理解所有事情是如何整合在一起的。谢谢

1 个答案:

答案 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::PXMyPolicies::PY,您将获得覆盖,但对于任何其他类型PN,您将获得在基类中定义的默认类型。

现在你需要的是能够自动构建MyPolicies等价物。为此,他们构建了一个具有虚拟继承的并行类型层次结构来创建PolicySelector(相当于MyPolicies)。我相信这也可以通过线性层次结构完成(这是Alexandrescu在 Modern C ++ Design 中提供的解决方案类型),但这需要使用添加额外代码的类型列表。在C ++ 11中,使用可变参数模板参数,线性层次结构变得更加简单,但在C ++ 98中,您只需编写一些内容就可以支持列表。