2

If have written a template function and the code only work correct if the template type is unsinged. Now I search for a way to prevent the fumction from compiling with signed types, without C++11.

template<typename T>
T foo() {
    T a=0;
    return a<<1;
}
gerum
  • 974
  • 1
  • 8
  • 21

2 Answers2

4

std::is_signed is only available since C++11, however before you can use std::numeric_limits<T>::is_signed.

As static_assert is also C++11, you have to use something else, eg the trick from here:

typedef int static_assert_something[something ? 1 : -1];
463035818_is_not_an_ai
  • 109,796
  • 11
  • 89
  • 185
0

Without library: for signed types, ~T(0) < T(0) but for unsigned types, ~T(0) > T(0). These are compile-time constants. See the other answer how to turn that into an error.

MSalters
  • 173,980
  • 10
  • 155
  • 350