我一直在尝试寻找一种方法,以在其基类中已为其分配默认值的派生类中跳过不在模板参数列表末尾的模板参数。
我已经在这个主题上做过一些研究,在SO上也是如此。虽然类似的问题已经在SO讨论-许多答案基本上表明它不工作都涉及到非常特殊的情况下,像散列表的情况下在这里。我也找到了“ Potatoswatter”这个答案,我认为这与跳过这样一个参数的可能性相矛盾。他在回答中声称,该声明将是有效的:
template< class A, class B = int, class C >
class X;
假设确实可以不跳过模板参数(除非在参数列表的末尾),这样的声明完全没有意义。由于为B分配了一个默认值,但后面紧跟没有默认值的C,因此在这种情况下,总是必须显式分配值B,从而使int的默认分配对B完全无效。上面的X声明有意义的唯一情形是以下Y声明之一有效的情形:
class Y : public X<double, , const std::string&> { ... }
class Y : public X<A = double, C = const std::string&> { ... }
因此,派生专用类时,真的不可能跳过不在模板参数列表末尾的模板参数吗?
如果不可能的话,为什么呢?为什么法律语法显然建议这样做(请参见上面的X类示例)?
如果实际上并非不可能,那么如何跳过分配了默认值的模板参数呢?
相关标准语言包含在“模板参数[temp.param]”(14.1)中。
本质上,只有在其应用的参数后面没有跟随任何没有默认参数的非压缩参数时,才可以使用默认参数([temp.param] / 11)。但是,您引用的语法在[temp.param] / 10描述的情况下可以在声明中使用:
可以使用的默认模板参数集是通过以默认函数参数(8.3.6)相同的方式合并模板的所有先前声明中的默认参数而获得的。[例子:
template<class T1, class T2 = int> class A; template<class T1 = int, class T2> class A;
相当于
template<class T1 = int, class T2 = int> class A;
—结束示例]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句