我正在阅读this一章,我无法获得设计,我只是理解我们想以某种方式逃避填充一些默认参数参数,即
template< typename T=int , typename V = float> struct foo;
foo</*evade first type argument, */ char> ha;
这整个句子也使我难以理解,因此我想我还没明白:
是的,我无法理解已经解释过的东西:(。请帮助我了解所有东西如何集成在一起工作。谢谢
最佳答案
如果我正确理解了这个问题,那么您是在询问总体设计的工作原理。
要解决的问题是能够为模板参数之一提供一个值,而不必为所有先前的参数提供它。解决方案是将类型从作为模板的参数转换为基类中的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中,您仅需编写大量代码即可支持该列表。关于c++ - 需要帮助来了解设计 “Named Template Arguments”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9996513/