在谷歌C++风格指南中,操作员超载一节建议不要超载任何操作符(“除非在罕见的特殊情况下”)。具体而言,委员会建议:
特别是,不要重载
operator==或operator<,这样您的类就可以作为STL容器中的键使用;相反,在声明容器时,应该创建相等和比较函式类型。
我有点模糊这样的函子会是什么样子,但我的主要问题是,你为什么要为这个写你自己的函子?定义operator<和使用标准的std::less<T>函数不是更简单吗?用一种比另一种有什么好处?
发布于 2008-10-08 16:32:55
除了最基本的类型之外,较少的操作并不总是琐碎的,甚至平等也可能因情况而异。
想象一下,一家航空公司想给所有乘客分配登机号码。这个数字反映了登机令(当然)。现在,是什么决定了谁先于谁?您可以采取客户注册的顺序--在这种情况下,少于操作的用户将比较签入时间。你也可以考虑顾客为他们的机票支付的价格--比现在的票价要低。
…诸若此类。总之,在operator <类上定义一个Passenger是没有意义的,尽管它可能需要在一个排序的容器中有乘客。我认为这正是谷歌所警告的。
发布于 2008-10-08 16:54:00
通常,定义operator<更好、更简单。
要使用函子的情况是需要多种方法来比较特定的类型。例如:
class Person;
struct CompareByHeight {
bool operator()(const Person &a, const Person &b);
};
struct CompareByWeight {
bool operator()(const Person &a, const Person &b);
};在这种情况下,可能没有一种很好的“默认”方法来比较和排序人员,因此不定义operator<和使用函子可能会更好。你也可以说,一般人是按身高排序的,所以operator<只叫CompareByHeight,任何需要按体重排序的人都必须显式地使用CompareByWeight。
通常情况下,问题在于定义函子是由类的用户决定的,因此当类需要在有序容器中使用时,您往往会得到对同一事物的许多重新定义。
发布于 2008-10-08 16:29:05
好吧,根据你引用的网页,函子没有多大优势(“操作人员可以欺骗我们的直觉,认为昂贵的操作是廉价的、内置的操作”)。
我的感觉是,一个人应该努力使你尽可能地将一流的对象分类,对我来说,这意味着让他们理解尽可能多的操作人员。
我已经有一段时间没有写函子了,但是它看起来是这样的:
class MyClass {....}
class LessThanMyClass : std:binary_function<MyClass, MyClass, bool>
{
public bool operator()(MyClass lhs, MyClass rhs)
{ return /* determine if lhs < rhs */ ; }
}
vector<MyClass> objs;
std::sort(objs.begin(), objs.end(), LessThanMyClass());}
https://stackoverflow.com/questions/183606
复制相似问题