模板类的非常量参数

时间:2011-06-23 15:25:32

标签: c++ templates

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

位域<长度>对象;

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

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

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

解决这个问题的一种方法是,如果您知道了bitset大小的上限,并将该常量用于模板化的bitset结构。如果上限是不可接受的,那么你将不得不使用不同的数据结构,类似于动态大小的矢量。

答案 2 :(得分:-1)

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

编辑:感谢John,#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的上限是更好的主意。