Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类的非恒定参数_C++_Templates - Fatal编程技术网

C++ 模板类的非恒定参数

C++ 模板类的非恒定参数,c++,templates,C++,Templates,我有一个来自API的模板类,它是用这样的东西实例化的 位场对象 问题是长度变量只有在运行时才知道 错误:“长度”不能出现在常量表达式中->这是错误消息 有什么建议吗 您必须使用另一个允许在运行时设置长度的位域数据结构。您必须使用另一个允许在运行时设置长度的位域数据结构。这取决于您需要的运行时灵活性。如果您处理的是一小部分场景,那么可以为您的可能性定义常量并有条件地实例化 编辑:谢谢John,对于静态常量的定义没有实际的理由。我很尴尬我的C显示出来了。也许人们会相信这是键盘故障 ... stati

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

位场<长度>对象

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

错误:“长度”不能出现在常量表达式中->这是错误消息


有什么建议吗

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

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

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

编辑:谢谢John,对于
静态常量
的定义没有实际的理由。我很尴尬我的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
}
。。。
静态常数int 8BIT=8;
静态常数int 16位=16;
静态常量int 32位=32;
...
if(someDynamicCriteria==8BIT)
{
...
位域对象;
...
}
else if(someDynamicCriteria==16位)
{
...
位域对象;
...
}
else if(someDynamicCriteria==32位)
{
...
位域对象;
...
}
其他的
{
//意外情况、错误和异常处理
}
显然,这会变得非常快。这是一种非常程序化的方法,如果您的逻辑需要真正的动态性,这种操纵很快就会失去其价值

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


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

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

编辑:谢谢John,对于
静态常量
的定义没有实际的理由。我很尴尬我的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
}
。。。
静态常数int 8BIT=8;
静态常数int 16位=16;
静态常量int 32位=32;
...
if(someDynamicCriteria==8BIT)
{
...
位域对象;
...
}
else if(someDynamicCriteria==16位)
{
...
位域对象;
...
}
else if(someDynamicCriteria==32位)
{
...
位域对象;
...
}
其他的
{
//意外情况、错误和异常处理
}
显然,这会变得非常快。这是一种非常程序化的方法,如果您的逻辑需要真正的动态性,这种操纵很快就会失去其价值

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


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

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


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

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


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

在这种情况下不应使用向下投票-除非您真的疯了。在相当有限的环境中,这可能是一种非常明智的方法,但是@DeadMG是对的——宏在这里完全没有意义,它们除了污染之外什么都没有添加。这很公平,但是为了我自己的启发,除了指出这个错误的方法之外,你能建议一个正确的方法吗?例如,创建一个包装类以接受动态大小并“切换”传递的大小以使用位字段是更好的选择吗,尽管有额外的复杂性?就我而言,我并没有说这个方法是错误的——只是您使用
#define
s很奇怪,除非有充分的理由使用它们,否则应该避免使用,我在这里没有看到。如果你真的想使用命名常量,你仍然可以使用<代码>静态const int < /Cord>值,这有利于在普通C++标识符范围规则中工作。没有否决,因为这是一个相当琐碎且有些不相关的问题。对于更大的问题,我想说,在适用的情况下,Bo Persson的建议(使用支持最大大小的位字段)可能是一个更好的折衷办法,而不是重复代码路径。向下投票-在这种情况下不应该使用宏,除非你真的疯了。在一个相当有限的环境中,这可能是一个非常明智的方法,但@DeadMG是对的——宏在这里完全没有意义,它们除了污染之外什么都没有添加。很公平,但是为了我自己的启发,除了指出这个错误的方法之外,你能建议一个正确的方法吗?例如,创建一个包装器类来访问