Boost logo

Boost Users :

Subject: [Boost-users] C++ guru required!
From: Robert Ramey (ramey_at_[hidden])
Date: 2012-02-17 15:40:12


I've got a really dumb question. My question is illustrated by the
following
code snippit.

template<class T, class U>
T inline operator%(const T & lhs, const U & rhs) {
  if(0 == rhs)
    throw std::domain_error("Divide by zero");
  if(boost::is_same<T, boost::uintmax_t>::value
  && boost::numeric::is_signed<U>::value
  ){
    if(1 == rhs || -1 == rhs) // is this dropped?
      overflow("unsigned type can hold this result");
  }
  return lhs % rhs;
}

I would like to think that the second if is always
dropped from the compile for a particular pair
of types since this can be evaluated at compile time.

If I'm correct, I can replace some tedious
template metaprogramming for some straightforward
and transparent code inserted in a convenient code
inserted in the most convenient place.

Andre Alex... gave a talk at "Going Native" proposing
a "static if" for this case. But I don't see the necessity for
for this since I would assume that the compiler
just optimises away the "dead" code. I've compiled
the above and it seems to do what I want but
still I wonder.

Basically I see lots of applications of variations
on this idea to get the benefits of tmp without
the attendent pain.

Am I missing anything here?

Robert Ramey


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net