/ / Operator zmiany operatora z podpisem czasu kompilacji - c ++, c ++ 98

Operator zmiany operatora z podpisem czasu kompilacji - c ++, c ++ 98

To jest makro, więc go nienawidzę, ale "działa" w tym, co chcę:

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

Musi to być czas kompilacji (constexpr działałby w C ++ 11, ale utknąłem w C ++ 98).

Każdy ma lepszy sposób (doładowanie jest w porządku).

Odpowiedzi:

4 dla odpowiedzi № 1
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);
}

0 dla odpowiedzi nr 2

Można to zrobić za pomocą szablonów (statyczny element jest poza klasą, ponieważ C ++ 03 nie obsługuje inicjalizacji klas statycznych elementów):

#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";
}