From: ramey@rrsd.comDate: Fri, 17 Feb 2012 12:40:12 -0800
I've got a really dumb question. My question is illustrated by the followingcode snippet. templateT inline operator%(const T & lhs, const U & rhs) { if(0 == rhs) throw std::domain_error("Divide by zero"); if(boost::is_same::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 alwaysdropped from the compile for a particular pairof types since this can be evaluated at compile time.
If I'm correct, I can replace some tedioustemplate metaprogramming for some straightforwardand transparent code inserted in a convenient codeinserted in the most convenient place.
Andre Alex... gave a talk at "Going Native" proposinga "static if" for this case. But I don't see the necessity forfor this since I would assume that the compilerjust optimises away the "dead" code. I've compiledthe above and it seems to do what I want butstill I wonder.
Basically I see lots of applications of variationson this idea to get the benefits of tmp withoutthe attendent pain.
Am I missing anything here?
If you want to (partially) specialize on types, then use a class template that can act as a function object (i.e. has an operator ()). I was going to leave at that, but I see some other problems.
Unless you use some sort of name-spacing (and even then), you just wrote a universal operator. Every type out there gets a modulus operation, whether they like it or not. Even types that already have one get a new one for type combinations they didn't anticipate. Never do this.The function ends by passing the real work to a modulus operator. Since the function itself is a universal modulus operator, you get infinite recursion!
So rewrite this as a function object class template, and specialize for certain combinations of built-in integer types.
Daryle W.