C++ 为什么不是';stl比较函数是一个成员吗?

C++ 为什么不是';stl比较函数是一个成员吗?,c++,stl,comparison,name-decoration,C++,Stl,Comparison,Name Decoration,只是好奇为什么stl::sort的比较函数不能是静态成员 我有一个小的助手类foo,它在头文件中声明和定义,但是现在我必须为cmp()的实现创建一个foo.cpp文件,所以它不是乘法定义的 我还必须考虑一个适当修饰的名称,这样fooCmp()就不会与任何其他cmp()冲突 因为它不能访问任何成员变量,任何需要访问其他值(例如,按与foo.bar的距离排序)的比较操作都需要复杂的bind2nd调用。如果您关心的是一个多定义比较函数,请尝试使用静态链接声明该函数。那么函数的作用域就不会超出它所在的编

只是好奇为什么stl::sort的比较函数不能是静态成员


我有一个小的助手类foo,它在头文件中声明和定义,但是现在我必须为cmp()的实现创建一个foo.cpp文件,所以它不是乘法定义的

我还必须考虑一个适当修饰的名称,这样fooCmp()就不会与任何其他cmp()冲突


因为它不能访问任何成员变量,任何需要访问其他值(例如,按与foo.bar的距离排序)的比较操作都需要复杂的bind2nd调用。

如果您关心的是一个多定义比较函数,请尝试使用
静态
链接声明该函数。那么函数的作用域就不会超出它所在的编译单元

也就是说,比较“函数”根本不需要是函数,而是可以是函数对象。函数对象非常类似于函数,但被实现为一个
操作符()
,它在常规类中接受适当的参数。因为它是一个常规类,所以可以将构造函数参数传递给该类

下面是一个简单的例子:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class comparator {
public:
    bool operator()(int a, int b) {
        return a < b;
    }
};

int main(int, char *[])
{
    vector<int> a;
    a.push_back(1);
    a.push_back(3);
    a.push_back(2);
    sort(a.begin(), a.end(), comparator());
    cout << a << endl;
}
#包括
#包括
#包括
使用名称空间std;
类比较器{
公众:
布尔运算符()(整数a,整数b){
返回a我不知道你在抱怨什么:

std::sort(begin,end)        // use operator<
std::sort(begin,end,order)  // Where order is a functor
std::sort(begin,end)//使用运算符<
排序(开始、结束、顺序)//其中顺序是函子
因此,顺序可以是:

  • 函数
  • 静态成员函数
  • 或行为类似于函数的对象
以下是我的作品:

class X
{
    public: static bool diff(X const& lhs,X const& rhs) { return true;}
};

int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end(),&X::diff);
}
X类
{
public:static bool diff(X const&lhs,X const&rhs){return true;}
};
int main()
{
std::载体a;
std::sort(a.begin()、a.end()、和X::diff);
}
但是,如果类具有某种自然顺序,那么为什么不为类定义操作符<。这将允许您访问成员,并且对于大多数需要定义顺序的标准容器/算法来说,它们的行为都很好

class X
{
    public: bool operator<(X const& rhs) const   {  return true;}
};
int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end());
}
X类
{

public:bool操作符实际上听起来像是函数 在课堂上宣布, 在标题中定义,但不在类外部,没有内联链接

例如:

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 
而不是

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
inline bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 
第一个将导致在每个编译单元中定义函数

#includes "foo.h"

std::sort
的比较函数可以是一个静态成员。不管你的问题是什么,它都不在那里-显示代码!如果VC++在你的STL中出现一个小错误时,没有生成一条错误消息,看起来像一只猫在你的键盘上走过,然后通过生成的perl脚本运行美国税务代码,这会有所帮助。这是所有C++实现的诅咒,不仅仅是VC++(虽然我希望他们在VC10中稍微改进一下,用代码> STATICO-ASPECT)。概念会有帮助,但是他们现在死在水里了…+ 1,MGB。你,先生,是一个互联网英雄。“我有一个小的助手类foo,它是在头中声明和定义的,但是现在我必须为cmp()的实现创建一个foo.cpp文件,这样它就不会被多次定义”你知道,你可以定义一个类,并在类定义中包含方法体。这样,如果可能的话,它们将被自动内联(这可能是比较器所需要的),您不必担心将其放在单独的文件中。很抱歉,defn有点错误-我想我记得您不能这样做。您应该添加“free function”指向可以传递到排序的参数列表。此外,使用&X::diff在视觉上与指向成员的指针不明确。我认为最好使用“&(X::diff)”或允许函数到指针的转换隐式地发生“X::diff”@mgb:您可能想到的例子是,谓词函数本身就是一个模板。问题是谓词参数不是自动推导出来的,因此在调用std::sort时必须显式指定它们。@Richard.您在跟踪我吗:-)我想上面的列表包括“free function”马丁:不,我不是在跟踪你(至少不是故意的)!你是我的“自由函数”评论,嗯,你是对的,我现在不知道我怎么会错过你列表中的“函数”。