测试模板参数的签名

Gun*_*iez 3 c++ templates

我需要掩盖一些值的前导位.如果该值是无符号的,我可以断言(保证)没有设置任意数量的前导位,即保证该值是有限的.

如果签名,我需要掩盖前导位(将值转换为一些不可移植的位,是的,我知道这一点:-)).如果值是无符号的,我想保存屏蔽操作.

所以我基本上有

template<typename T, some more template parameters>
class {
    unsigned transform(T value) {
        ...
        if (isSigned(T)) {
            value &= mask;
        }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以编写一个isSigned(),它可以在编译时进行评估(以使优化器能够删除未签名的死代码)?

当然我可以添加另一个模板参数......

Ker*_* SB 5

是.你必须使用部分专业化:

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>而不是自己编辑.