Немного не по теме, но я использую это:
template<typename T>
constexpr int sgn(const T &a, const T &b) noexcept{
return (a > b) - (a < b);
}
template<typename T>
constexpr int sgn(const T &a) noexcept{
return sgn(a, T(0));
}
и я обнаружил, что первая функция - с двумя аргументами - гораздо более полезна из "стандартного" sgn (), потому что она чаще всего используется в таком коде:
int comp(unsigned a, unsigned b){
return sgn( int(a) - int(b) );
}
против
int comp(unsigned a, unsigned b){
return sgn(a, b);
}
нет броска для неподписанных типов и без дополнительного минуса.
на самом деле у меня есть этот кусок кода с использованием sgn ()
template <class T>
int comp(const T &a, const T &b){
log__("all");
if (a < b)
return -1;
if (a > b)
return +1;
return 0;
}
inline int comp(int const a, int const b){
log__("int");
return a - b;
}
inline int comp(long int const a, long int const b){
log__("long");
return sgn(a, b);
}