2009-07-30 5 views
1

なぜstl :: sortの比較関数を静的メンバーにすることができないのか不思議です。stlが関数をメンバーと比較していないのはなぜですか?

私は小さなヘルパークラスfooを宣言し、ヘッダーで定義していますが、今は多重定義されていないようにcmp()の実装用にfoo.cppファイルを作成する必要があります。

また、fooCmp()は他のcmp()と衝突しないように、適切に装飾された名前を考える必要があります。

メンバー変数にアクセスできないため、他の値へのアクセスが必要な比較操作(たとえば、foo.barからの距離による並べ替え)は、複雑なbind2nd呼び出しが必要です。

+2

コンパイル単位ごとに関数を定義させる_スタティック・メンバ:スタティック・メンバである可能性があります。あなたの問題が何であれ、そこにはありません - コードを見せてください! –

+3

VC++がSTLに勝利したときに、あなたのキーボードを横切って猫のように見えるエラーメッセージが表示されず、結果として得られるperlスクリプトを通して米国の税コードが実行された場合に役立ちます。 –

+0

VC++だけでなく、C++実装の呪いです(しかし、VC10では 'static_assert'を少し改良することを望みます)。コンセプトはそこで助けになるだろうが、悲しいかな、彼らは今水で死んでいる... –

答えて

3

私はあなたが文句をしているかわからない:

std::sort(begin,end)  // use operator< 
std::sort(begin,end,order) // Where order is a functor 

ので、順序は指定できます

  • 機能
  • 静的メンバー関数
  • または、関数のように動作するオブジェクト。

私のために、次の作品:

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); 
} 

しかし、クラスはいくつかの自然順序付けを持っているならば、なぜちょうどクラスのオペレータ<を定義していません。これにより、メンバーへのアクセスが可能になり、注文を定義する必要のある標準のコンテナ/アルゴリズムのほとんどに対してうまく動作します。

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

    std::sort(a.begin(),a.end()); 
} 
+0

申し訳ありません、私はあなたがこれを行うことができなかったことを思い出していたと思いました。 –

+0

ソートに渡すことができる引数のリストに "free function"を追加する必要があります。また、&X :: diffを使用すると、メンバへのポインタで視覚的にあいまいです。私は "&(X :: diff)"を使うことや、関数を暗黙的に "X :: diff"になるようにポインタ変換することが良いと思う。 –

+0

@mgb:考えているかもしれない例は、あなたの述語関数自体がテンプレートであるところです。問題は、述語引数が自動的に導かれないので、std :: sortを呼び出すときに明示的に指定する必要があるということです。 @リチャード。 –

0

複数定義された比較関数に関心がある場合は、staticリンケージで関数を宣言してみてください。関数のスコープは、それが見つかったコンパイル単位を超えて拡張されません。

つまり、あなたの比較 "関数"は関数でなくてもかまいませんが、代わりに関数オブジェクトでもかまいません。関数オブジェクトは関数によく似ていますが、通常のクラス内で適切なパラメータを取るoperator()として実装されています。それは通常のクラスなので、クラスにコンストラクタパラメータを渡すことができます。ここで

簡単な例です:

#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; 
} 
0

機能が が は、ヘッダではなく、クラスの外で定義され、クラスで宣言されたように、実際に

すなわちインラインリンケージなしのようなものに聞こえる:

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" 
関連する問題