C++;运算符重载,了解谷歌风格指南 我正在跟随一本书学习C++(来自Python背景)。我写了这篇文章,它很有效: class CatalogueItem { public: CatalogueItem(); CatalogueItem(int item_code, const string &name, const string &description); ~CatalogueItem() {}; bool operator< (const CatalogueItem &other) const; ... private: ... }; ... list<CatalogueItem> my_list; // this is just me playing around CatalogueItem items[2]; items[0] = CatalogueItem(4, string("box"), string("it's a box")); items[1] = CatalogueItem(3, string("cat"), string("it's a cat")); my_list.push_back(items[0]); my_list.push_back(items[1]); my_list.sort();

C++;运算符重载,了解谷歌风格指南 我正在跟随一本书学习C++(来自Python背景)。我写了这篇文章,它很有效: class CatalogueItem { public: CatalogueItem(); CatalogueItem(int item_code, const string &name, const string &description); ~CatalogueItem() {}; bool operator< (const CatalogueItem &other) const; ... private: ... }; ... list<CatalogueItem> my_list; // this is just me playing around CatalogueItem items[2]; items[0] = CatalogueItem(4, string("box"), string("it's a box")); items[1] = CatalogueItem(3, string("cat"), string("it's a cat")); my_list.push_back(items[0]); my_list.push_back(items[1]); my_list.sort();,c++,syntax,C++,Syntax,这就是《风格指南》所指的吗 有没有人可以选择哪种方法更“正确” 函子类型更像这样: struct CatalogueItemLessThan { bool operator()(const CatalogueItem &a, const CatalogueItem &b) { } }; list<CatalogueItem> my_list; // this is just me playing around CatalogueIt

这就是《风格指南》所指的吗

有没有人可以选择哪种方法更“正确”


函子类型更像这样:

struct CatalogueItemLessThan
{
    bool operator()(const CatalogueItem &a, const CatalogueItem &b)
    {
    }    
};
list<CatalogueItem> my_list;

// this is just me playing around
CatalogueItem items[2];
items[0] = CatalogueItem(4, string("box"), string("it's a box"));
items[1] = CatalogueItem(3, string("cat"), string("it's a cat"));

my_list.push_back(items[0]);
my_list.push_back(items[1]);

my_list.sort(CatalogueItemLessThan());
那么用法如下所示:

struct CatalogueItemLessThan
{
    bool operator()(const CatalogueItem &a, const CatalogueItem &b)
    {
    }    
};
list<CatalogueItem> my_list;

// this is just me playing around
CatalogueItem items[2];
items[0] = CatalogueItem(4, string("box"), string("it's a box"));
items[1] = CatalogueItem(3, string("cat"), string("it's a cat"));

my_list.push_back(items[0]);
my_list.push_back(items[1]);

my_list.sort(CatalogueItemLessThan());
列出我的清单;
//这只是我在玩儿
目录项目[2];
项目[0]=目录项(4,字符串(“框”),字符串(“它是一个框”);
项目[1]=目录项(3,字符串(“猫”),字符串(“它是猫”);
my_list.push_back(项[0]);
my_list.push_back(项目[1]);
my_list.sort(catalogeItemlessthan());
这样做的主要优点是允许您将排序与对象本身分离。现在,您可以根据需要提供多种类型的排序,并在不同的位置使用它们。(例如,字符串可以按词法顺序排序,也可以不区分大小写或“”排序

与松散函数相比,使用函子的优点是可以将参数传递到比较中,以修改函子的行为方式


一般来说,谷歌风格的指南并不是真正的最佳风格指南(特别是例外情况,但这是另一种讨论)。如果一个对象有明显的排序顺序,我经常添加默认的<代码>操作符> P>一个函子类型是C++类型(类或结构),重载<代码>()运算符,使该类型的实例的行为类似于函数。这类似于Python中实现
\uuu调用的类(


一些STL集合类型,如
std::map
需要一个
key\u compare
functor来对内部树结构中的键进行排序,从而提供快速的访问时间。默认情况下,这是
std::less
,它使用
操作符,Google试图告诉您的是以下内容


正如您所知,您可以重载一个且只有一个运算符的Yep,这就是它们的意思;此类类有时被称为比较器。使用函子的另一个主要优点是,您可以使用函子作为模板的类型参数,例如
std::map
,这是普通函数无法做到的。很好,但绝对不正确!:)您可以使用普通函数作为模板类的参数。普通函数(衰减为函数pOnters)也是函子,它们与“std::map”(例如)的比较器一样工作良好。试试看。基于类的函子的主要优点是,可以将内部状态附加到该函子,即向类添加数据字段。普通函数不能附加这样的状态。否则,基于类的函子和普通函数之间就没有区别了。@Greg Rogers:没错(忽略了一些超级高级编译器的功能)。此外,基于类的函子有时更能抵抗重载解析中的歧义。然而,这并没有改变一个事实,即普通函数也是函子,并且在允许函子的任何地方都可以正常工作。这不是您使用它的方式。当然,您必须将函数指针类型作为类型参数传递给模板。函数指针本身作为参数传递给构造函数。例如:std::map(testLess)Functor是一个比上面描述的更通用的概念。函子是接受后缀“()”运算符的所有对象。普通函数或函数指针也是函子。它不必是一个类类型为重载“()”的对象。不过,我只是吹毛求疵,我认为Ferdinand定义术语“函子类型”是正确的。他没有说“函子是”+1用于添加好友推荐!关于为什么这是一个建议的好观点。另一方面,许多类型只需要按一种方式进行排序。如果你拥有所有的代码,从使用操作符到函数的转换并不困难,主要的困难是如果你为别人提供了一个库,并且不能仅仅从编译器上跳出变化。我认为谷歌风格指南不是真正的C++指南的最佳集合。如果你阅读它,他们明确地在几个部分中陈述了决定是出于他们自己的内部原因,而不是因为它们是“正确的”。谷歌本质上有一个“无趣”的C++方法。这可能是一个组织中必须的,它包含了数千名有才华的程序员,他们必须以某种方式被说服产生相互理解的C++。但他们的风格指南让我诚实地想知道为什么他们决定使用C++,而不是C与一些约定一起模拟一个虚拟调用。对程序员来说,把各种可能性摆在面前,然后把它们抢走似乎很残忍;-)重载运算符<和运算符=,这是很正常的。这里的问题是,早期的人们滥用运算符重载,并且在阅读代码时不容易看到副作用。所以要理智。“早期的人们滥用操作员超载”-不仅仅是标准委员会,还有auto_ptr。@SteveJessop:有人对我可以参考的“谷歌风格指南”进行了深入分析吗。显示C++推荐中的好/坏/丑的东西。