模板类的非常量参数

Nonconstant parameter for a template class

本文关键字:常量 参数 非常      更新时间:2023-10-16

我有一个来自API的模板类,它是用这样的东西实例化的。

位字段<长度>对象;

问题是长度变量只有在运行时才知道。

错误:"length"不能出现在常量表达式中->这是错误消息

有什么建议吗?

模板严格来说是一个编译时概念。编译后,它们会被烘焙,无法更改。不能将仅在运行时已知的信息用作模板参数。

解决这一问题的一种方法是,如果您知道位集大小的上限,并将该常数用于模板化位集结构。如果上限太大,您将不得不使用不同的数据结构,类似于动态调整大小的向量。

您必须使用另一个允许在运行时设置长度的位字段数据结构。

这取决于您需要的运行时灵活性的程度。如果您处理的是一小部分场景,则可以为您的可能性定义常量并有条件地实例化。

编辑:谢谢约翰,#definestatic const没有实际的理由。我很尴尬我的C出现了。也许人们会相信这是键盘故障。

...
static const int  8BIT = 8;
static const int 16BIT = 16;
static const int 32BIT = 32;
...
if( someDynamicCriteria == 8BIT )
{
    ...
    BitField<8BIT> object;
    ...
}
else if( someDynamicCriteria == 16BIT )
{
    ...
    BitField<16BIT> object;
    ...
}
else if( someDynamicCriteria == 32BIT )
{
    ...
    BitField<32BIT> object;
    ...
}
else
{
    // Unexpected case, error and exception handling
}

显然,这会变得非常快。这是一种非常程序化的方法,如果你的逻辑需要真正动态,这种操纵很快就会失去价值。

编辑:让我明确一点。如果您真的被锁定在这个特定的API和数据结构中,并且需要处理的案例集很小,那么这是一种方法。换句话说,如果"使用其他东西"(老实说,这是一个更好的答案)根本不起作用。

我也同意其他人的观点,如果浪费的空间不是什么大不了的话,那么为BitField定义一个适用于所有预期情况的上界是一个更好的主意。