【发布时间】:2016-08-01 09:29:00
【问题描述】:
假设我需要一个函数模板,它对不同的整数类型执行不同的位移量。例如,如果输入值n 的类型为char,则该函数将对n>>2 和n<<3 进行一些计算。如果是short int,那么函数使用n>>1和n<<8。对于int 类型,会有n>>11 和n<<9,以此类推。当然,上面提到的值只是举例,和int_type的大小没有关系。
我对这个问题的建议是这样的:
template <typename Num_Type = char, int s1 = 2, int s2 = 3> void test1(Num_Type &n)
{
// this is just an example code:
int a = n >> s1,
b = n << s2;
// do some calculations on a and b
}
所以我可以将此模板用于不同类型的输入值。但是当我编译它时,它给了我几个关于移位操作中未定义行为的警告,因为值可能太大了。
所以这个问题可以用两种形式提出:
如何自定义位移操作而不会收到“未定义行为”警告?或
-
我可以有一个有限的数据类型,比如
intlength,它只能有一个指定的数字范围,比如0, 1, 2, ... , 31?我知道这听起来可能很愚蠢,但在这种情况下,我可以将模板定义为template <typename Num_Type = char, intlength s1 = 2, intlength s2 = 3> void test1(Num_Type &n)
因此编译器不应该抱怨移位值。
【问题讨论】:
-
为什么会收到警告?我的意思是,你为什么要把
n换成太大的s1或s2? -
@rozina 我不是想用太大的值来移动它,我的预期值很小,但是由于移动量是 int 类型,编译器认为它可能太大了
-
我明白了。也许警告在这里没有用,您可以为此功能禁用它。为了安全起见,您可以将断言添加到函数体中,以测试
s1和s2不是太大。 Clang does not produce any warnings though -
@rozina 你能提供更多细节吗?我在 C++ 方面不是很有经验,只依赖尝试和错误,当然还有 google
-
我的问题的第二部分呢?
标签: c++ templates bit-manipulation undefined-behavior