模板类的非常量参数
Nonconstant parameter for a template class
我有一个来自API的模板类,它是用这样的东西实例化的。
位字段<长度>对象;
问题是长度变量只有在运行时才知道。
错误:"length"不能出现在常量表达式中->这是错误消息
有什么建议吗?
模板严格来说是一个编译时概念。编译后,它们会被烘焙,无法更改。不能将仅在运行时已知的信息用作模板参数。
解决这一问题的一种方法是,如果您知道位集大小的上限,并将该常数用于模板化位集结构。如果上限太大,您将不得不使用不同的数据结构,类似于动态调整大小的向量。
您必须使用另一个允许在运行时设置长度的位字段数据结构。
这取决于您需要的运行时灵活性的程度。如果您处理的是一小部分场景,则可以为您的可能性定义常量并有条件地实例化。
编辑:谢谢约翰,#define
比static 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
定义一个适用于所有预期情况的上界是一个更好的主意。
相关文章:
- 如何创建长度由常量参数指定的数组
- 常量参数"real"常量吗?
- 常量参数存储在哪里 (C++)?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 一个模板方法,用于同时接受常量和非常量参数
- 如何在使用 Qt5 构造函数时将非常量参数修改为常量参数?
- C++演示函数同时使用常量参数,即指针,这是为什么?
- C++函数中的常量参数
- 为什么一个方法对同一个变量有常量和非常量参数?
- 重载、常量参数、const_cast、const_cast<字符串 &>
- 提供带有常量参数的函数指针作为带有非常量参数的函数指针是否安全?
- 将函数赋值给函数指针,常量参数正确性
- 完美转发常量参数以进行持续评估
- 为什么重载"<<"需要一个常量参数?
- 我可以有常量参数包吗
- C++-常量参数和类变量是否令人讨厌
- 类的C++常量参数
- C++:复制构造函数,该构造函数使用具有非常量参数的函数
- C++日食给出了常量参数的"Invalid Arguments"
- 如果我使用非常量参数定义那些,我是否仍然会获得默认的复制构造函数和运算符 =