【发布时间】:2019-05-07 19:38:18
【问题描述】:
我有一个带有两个整数作为输入的模板。一个可能比另一个有更大的类型。我的代码进行了相应的转换,因此结果适合 目标类型。
下面是函数的基本思路:
template<typename S, typename D>
D convert(S a)
{
return static_cast<D>(a);
}
但是,当S 和D 之间的大小发生变化时,我想改变这个值。所以我添加了几个条件:
if(sizeof(S) < sizeof(D))
{
return a << (sizeof(D) - sizeof(S)) * 8;
}
if(sizeof(S) > sizeof(D))
{
return a >> (sizeof(S) - sizeof(D)) * 8;
}
问题是我收到这些错误:
conversions.cpp: 在‘void convert(buffer_&) [with S = unsigned char; D = 短无符号整数; buffer_t = std::vector]':
Conversions.cpp:从这里需要
Conversions.cpp:错误:右移计数 >= 类型的宽度 [-Werror=shift-count-overflow]d[idx] = convert_sign<S, D>(static_cast<std::int64_t>(s[idx]) >> (sizeof(S) - sizeof(D)) * 8);
_注意:对于那些不理解的人,(sizeof(S) - sizeof(D)) 或 (sizeof(D) - sizeof(S)) 在错误 if() 块中将是否定,因此被视为真的大作为移位参数(由于移位参数被视为无符号值,因此它非常大并且不是负数,无论如何sizeof() 返回一个无符号的std::size_t。)
显然,我可以使用编译指示忽略警告并完成它。
不过,我所期待的是,具有 false 的 if() 不会被编译,因此不会出现错误,因为这发生在编译时(即编译器知道 if() 块是否会在编译时执行或不执行。)有没有办法不使用编译指示并仍然避免错误?
【问题讨论】:
-
你试过
if constexpr吗? -
@max66,做到了!它在 C++17 下编译,带有
constexpr。伟大的!随意写一个关于它的答案。
标签: c++ templates c++14 c++17 template-meta-programming