How about something like this: -
#include <iostream> template <int A, int B, bool D> class shift { }; template <int A, int B> class shift<A, B, false> { public: static int result(int x) {return x << (BA);} }; template <int A, int B> class shift<A, B, true> { public: static int result(int x) {return x >> (AB);} }; template <int A, int B> int f(int x) { return shift<A, B, (A>B)>::result(x); } int main() { std::cout << f<1, 2>(10) << "\n"; std::cout << f<2, 1>(10) << "\n"; }
source share