2015-07-11 14 views
0

所以从我所知道的以下两个函数的行为应该完全一样。 但是,如果我使用第一个实现,编译器似乎无法实现它相当于第二个。无论如何提示编译器使用第二个?如何让C++编译器使用无符号签名技巧进行比较优化

换句话说,我讨厌做static_cast的东西...无论如何避免它?

// In my real use case, range will never be negative.... 
// All I want is to return (diff > range || diff < 0) assuming range >=0 
bool IsOutofRange1(int diff, int range) { 
    if ((range >= 0) && (diff > range || diff < 0)) return true; 
    if (range < 0 && diff > range && diff < 0) return true; 
    return false; 
} 

bool IsOutofRange2(int diff, int range) { 
    if (static_cast<unsigned>(diff) > static_cast<unsigned>(range)) return true; 
    return false; 
} 
+0

你为什么讨厌'static_cast'? – GWW

+2

@GWW那你应该讨厌所有的演员。 – emlai

+2

http://stackoverflow.com/questions/31347420/can-we-and-how-safe-is-to-signed-to-unsigned-trick-to-save-one-comparison-in – Steephen

回答

0

如果你的范围从不否定,为什么你使用签名类型(是的,我知道你讨厌铸造)?如何超载:

bool IsOutofRange(int diff, int range) 
{ 
    .... 
} 

bool IsOutofRange(int diff, unsigned range) 
{ 
    if (static_cast<unsigned>(diff) > range) return true; 
    return false; 
} 

当然迫使编译器使用第二个版本你会中(我的天啊...):

IsOutofRange(diff,static_cast<unsigned>(range)); 

我希望帮助,我约深感抱歉static_cast'ing。