我有一个简单的C ++结构如下:
// Functor for peak to decreasing intensity sorting
struct cmp_decr_int2
{
bool operator() (peak2 a, peak2 b)
{
return a.int2 > b.int2;
}
};
此示例中的运算符是否过载?
答案 0 :(得分:10)
是。 operator()
被称为“函数调用”运算符,并允许对象可用,就好像它是一个函数一样。这样的课程被称为“仿函数”。
一种常见的模式是使函子比较两个事物的相等或关系,用于需要比较谓词的任何事物。 (例如,这个可以在std::map
中使用。它会有一个像cmp_decr_int2 compare;
这样的成员,然后它可以比较两件事之间的关系:if (compare(x, y)) /* x is less than y, by some metric */
)
这个特定的结构通过比较他们的peak2
成员来命令两个int2
。它可以更好地写成:
struct cmp_decr_int2
{
// note const! vvvvv
bool operator() (peak2 a, peak2 b) const
{
return a.int2 > b.int2;
}
};
该函数应该是const
,因为它不需要更改任何成员(没有更改。)const
-correctness很重要。*
在许多情况下,这些仿函数用于参数本身为const
的上下文中,因此您应该按照示例中的值或通过常量引用来获取参数。
您应该更喜欢通过const-reference over-value传递类型,除非该类型是基本类型(float,unsigned int,double等)或小于void*
。在大多数情况下,您将通过const-reference:
struct cmp_decr_int2
{
// note const&: vvvvv v vvvvv v vvvvv
bool operator() (const peak2 & a, const peak2 & b) const
{
return a.int2 > b.int2;
}
};
<子>
*如果在std::map
中将其用作谓词,例如,如果没有const
,则地图将无法在const
函数内比较两件事。
子>
答案 1 :(得分:0)
C ++中的结构只是具有public而非private的默认访问者的类。所以,是的,这会导致函数过载。
答案 2 :(得分:0)
在c ++中,除了默认参数访问是public:
而不是private:
之外,结构在各方面都像一个类。当定义类型的使用范围非常狭窄时,例如在简单仿函数的示例中,使用struct而不是类是常见的做法。
这个例子的作用是模拟函数指针的外观,而不会有可能为null的脆弱性。
此处operator()
成员重载函数调用。当你尝试做类似的事情时:
cmp_decr_int2 foo;
foo(peek2(), peek2());
调用重载成员。
答案 3 :(得分:0)
#include <iostream>
using namespace std;
struct cmp_decr_int2
{
bool operator() (int a, int b)
{
return a > b;
}
bool operator() (int i)
{
return i > 0;
}
};
int main()
{
cmp_decr_int2 a;
cout << a(1, 2) << endl;
cout << a(1) << endl;
}
是的,确定可以超载功能!这对我很有用。
答案 4 :(得分:0)
$ 13.5.4州 -
operator()应该是一个具有任意数量参数的非静态成员函数。它可以有默认参数。它实现了函数调用语法postfix-expression(expression-listopt),其中postfix-expression计算为类对象,而可能为空的表达式列表与类的operator()成员函数的参数列表匹配。因此,如果T :: operator()(T1,T2,T3)存在,则调用x(arg1,...)被解释为类型为T的类对象x的x.operator()(arg1,...)如果操作符被重载决策机制(13.3.3)选为最佳匹配函数。
因此,struct'cmp_decr_int2'肯定会重载operator()。
请注意,这也是C ++中唯一可以使用可变数量参数的运算符。