2012-04-03 19 views
2

我读this章,我无法得到的设计,我只是明白,不知怎的,我们要回避填充一些缺省参数的参数,即需要帮助理解设计“命名模板参数”

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

这整个一句话也躲避我,由于我猜我没有得到整个事情:

我们的技术包括将默认值类型的基类 通过派生覆盖其中一些的。直接指定类型参数而不是 ,我们通过帮助程序 类提供它们。例如,我们可以编写BreadSlicer<Policy3_is<Custom> >。 因为每个模板参数都可以描述任何策略,所以默认值不能不同。换句话说,每个 的模板参数都是相当的高水平...................

是的我无法理解已经解释过的东西事情:(。请帮助我了解所有的事情是如何一起工作的综合。谢谢

+1

你是否理解他们试图解决的问题?理解问题的第一步是理解问题:*给定一个带有M参数的模板,其中有默认值,如何更改第n个参数的值,而不必明确说明所有前面的(n-1)参数?* – 2012-04-03 15:34:28

+0

@DavidRodríguez-dribeas是的,我想,我已经描述了我的理解,我的理解,谢谢 – 2012-04-03 15:35:56

+0

什么是你不明白,在本章中解释的*句子*或解*。这句话听起来不像* complex *:创建一个具有默认参数类型的基类,然后通过继承覆盖其中的一些。或者你是否在询问该解决方案的实施? – 2012-04-03 15:40:50

回答

4

如果我正确地理解了这个问题,你问的是整体设计是如何工作的 要解决的问题是能够提供其中一个模板参数无需为所有先前的参数提供它,解决方案是将类型从参数传递到模板,然后转到基类中的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中,您必须编写相当多的代码才能支持列表。

+0

我真的很感谢你的帮助。你的解释对我来说真的很有意义,非常感谢:) – 2012-04-03 16:36:53