在cpp中,我想知道是否有更好的方法来执行以下操作:
bool operator<(...) {
if( x < X )
return true;
else if ( x > X )
return false;
else if ( y < Y )
return true;
else if ( y > Y )
return false;
else if ( z < Z )
return true;
else if ( z > Z )
return false;
.... so on
else
return false;
}
这类似于在列表[x,y,z,...]和[X,Y,Z,...]之间应用strcmp类型的功能。这里x和y的类型(或y和z或X和Y)可能不相同,但是对(x,X)和(y,Y)和(z,Z),...是相同的输入或拥有运营商&lt;和&gt;为他们定义。
除了在C ++中使用一个巨大的if-else-if块之外,还有更好的方法来实现上述功能吗?
@Edited 用于上述方法的用例就是这样的。 我有一个班级
NextHop{
macAddr : MacAddr;
intf : Interface;
... so on
}
这里MacAddr是一个类,它的比较运算符&#39;&lt;&#39;只是比较字符串,接口是一个类,它比较两个整数值。现在我想实现一个运算符&lt;对于NextHop。
答案 0 :(得分:7)
bool operator<(...) {
return std::tie(x,y,z,...) < std::tie(X,Y,Z,...);
}
答案 1 :(得分:0)
在将来的某个C ++版本中,您可以使用新的比较运算符<=>
来实现“任何类型的通用比较函数”(它返回类似于strcmp
的值,-1, 0或1,基于第一个更小,相等或更大)。 [这只会有助于为一个类型编写一个更通用的比较运算符的意图 - 如果你有三对单独的变量就没那么真正有帮助]
但是,对于C ++的当前版本,如果您有许多不同类型的变量[成员变量或常规变量],您最终必须一次进行一次比较。对于上面的特定模式,您可以通过这种方式缩短序列,但如果有三个以上的值,它仍然会变得非常冗长......
if (x < X) return true;
if (x == X)
{
if (y < Y) return true;
if (y == Y) return z < Z;
}
return false;
以上将是您检查日期是否小于另一个日期的方式,例如,当输入为年,月,日时 - 假设X
为年,Y
月和Z
一天。
对于大量相同类型的值,您当然可以使用std::lexicographical_compare
。
答案 2 :(得分:0)
另一种可能性是
bool operator<(...) {
if( x != X )
return (x < X);
else if (y != Y)
return (y < Y);
else if (z != Z)
return (z < Z);
.... so on
else
return false;
}
将比较结果减半