编译时间符号移位运算符

时间:2014-04-29 13:40:26

标签: c++ c++98

这是一个宏,因此我讨厌它,但它“适用于”我想要的东西:

#define signed_shift(val,shift) ((shift) < 0 ? (val) >> -(shift) : (val) << (shift))

它需要编译时间(constexpr可以在C ++ 11中运行,但我被卡在c ++ 98中)。

任何人都有更好的方法(提升是可以的)。

2 个答案:

答案 0 :(得分:4)

template <int val, int shift>
struct signed_shift
{
    static const int result = (shift < 0) ? (val >> -shift) : (val << shift);
};

int main()
{
    BOOST_STATIC_ASSERT(signed_shift<4, 3>::result == 32);
    BOOST_STATIC_ASSERT(signed_shift<4, 0>::result == 4);
    BOOST_STATIC_ASSERT(signed_shift<4, -1>::result == 2);
}

答案 1 :(得分:0)

这可以使用模板完成(静态成员是类外的,因为C ++ 03不支持静态成员的类内初始化):

#include <iostream>

template<typename T, T val, T shift>
struct signed_shift {
    static T const value;
};

template<typename T, T val, T shift>
T const signed_shift<T,val,shift>::value
    = ((shift) < 0 ? val >> -shift : val << shift);

int main()
{
    std::cout << signed_shift<int, 1, 3>::value << '\n';
}