我需要掩盖一些值的前导位.如果该值是无符号的,我可以断言(保证)没有设置任意数量的前导位,即保证该值是有限的.
如果签名,我需要掩盖前导位(将值转换为一些不可移植的位,是的,我知道这一点:-)).如果值是无符号的,我想保存屏蔽操作.
所以我基本上有
template<typename T, some more template parameters>
class {
unsigned transform(T value) {
...
if (isSigned(T)) {
value &= mask;
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以编写一个isSigned(),它可以在编译时进行评估(以使优化器能够删除未签名的死代码)?
当然我可以添加另一个模板参数......
是.你必须使用部分专业化:
template <bool> struct impl { static void foo(); };
template <> struct impl<true> { static void foo(); };
template <typename T> struct Foo
{
void do_magic(T const &)
{
impl<std::is_signed<T>::value>();
// ...
}
};
Run Code Online (Sandbox Code Playgroud)
您可以使用现成的is_signed特质类,<type_traits>而不是自己编辑.