简而言之,请考虑以下(伪)代码:
switch (n) {
case 15:
(keyword) customtemplate<15> t_var; /* I want it to be outside of switch */
break;
case 255:
(keyword) customtemplate<255> t_var; /* I want it to be outside of switch */
break;
default:
break;
}
t_var.do_something();
我想知道是否有一些(keyword)
使跟随变量成为全局变量,或者不在切换用例范围之内。
我想要这样一个奇怪的代码的原因是,我无法声明具有任意数量n的模板变量,即:
int n = 15; // or int n = 255;
custometemplate<n> t_var; /* I can't do this */
t_var.do_something;
在customtemplate
这个帖子中提到的是实际上可以RS<n,k>
在ezpwd -里德-所罗门。我要声明RS<n, k>
这是一个RS<15,2>
,RS<15, 4>
,RS<15, 7>
,RS<15, 11>
,RS<64, 32>
,RS<160, 128>
。
简单回答是不”!
在您的情况下,不同的模板实例就是不同的类型。
如果您可以做您想做的事,那么问题就出在如何处理这个任何类型的实例上。您以后如何使用此变量?
切记:创建模板实例是在编译时完成的!在运行时完成开关盒的运行。
您的代码产生与以下内容相同的问题:
switch (foo)
{
case 1:
int bar;
break;
case 2:
float bar;
break;
}
??? and now how the compiler should handle two different types ???
再次:模板实例是不同的类型!
正如其他人已经在这里提到的那样,您可以使用一种变体类型,它仅包含给定类型列表的一个实例。它还包含一个信息,该信息实际上存储在此变量实例中。
但是我更喜欢使用可用的实现而不是编写自己的实现。为此,请参见Boost Variant http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html
但是作为我的经验的简历:如果您认为需要一种变体类型,则可以充分证明您的设计。提示:如果您需要一个变体类型,以后您会在每次处理此变体时看到您必须检查实际内容。我认为这通常是违反良好的OOP设计的。它可以提供帮助,但我认为应该避免!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句