2012-03-28 11 views
0

現在、関数のオーバーロードと関数ポインタの両方を把握しようとしています。 コードを短縮するために、比較演算子への関数ポインタを作成する必要があります。私の元のコードでは、ループトラフと浮動変数のペアの多くのペアを比較します。 比較後の私の行動は、第3の半静的変数が正または負であるかどうかに依存します。このバージョンでは、すべてのペアの半静的変数の値をチェックするか、多くのコードを複製する必要があります。私が代わりに一度angleRightを評価して、オペレータ>またはオペレータ<のいずれかに関数ポインタを格納することができれば、私が代わりにこの関数ポインタを使用することができるだろうと全体をangleRight評価するだけでなく、避けることができ比較演算子への関数ポインタ

double angleRight; //This variable is either positive or negative and is not reassigned for the purpose of this code 

while (points.size() > 2){ 
siz = points.size(); 
for (int i = 0; i < siz; i++){ 
    if (angleRight > 0 && points[i].angle < 0){ 
<Do something> 
    <remove points[i]> 
    } else if (angleRight < 0 && points[i].angle > 0){ 
    <Do something else> 
     <remove points[i]> 
    } 
} 

「else」ブロック。 関数ポインタを理解しようとしましたが、オーバーロードされたメンバ関数へのアクセスが必要な場合、どうすれば管理できたかがわかります。 「少ない」は私が欲しいん何 二つの機能「大きな」とを作る::

//This does not compile: 
bool (*compar) (float) /*const*/ = &float::operator<; 

EDITは:

//This compiles 
class Bs{ 
    public: 
    float x; 
    bool operator< (Bs y){ 
    return x < y.x; 
    } 
}; 
bool (Bs::*compare) (Bs) /*const*/ = &Bs::operator<; 

しかし、私が本当にやりたいこと/想像は、このようなものである

bool greater(float x, float y){ 
    return x > y; 
} 
bool less(float x, float y){ 
    return x < y; 
} 

bool (*compar) (float, float) = (angleRight < 0)? &greater : &less; 

しかし、実際には関数を記述する必要があります。 float-operator>に直接アクセスする方法はありませんか?

+0

この質問の究極の目標は何ですか?それはあなたが「関数のオーバーロードと関数ポインタの両方を把握しようとしている」ためか、ルーチンをより効率的にしたいのですか? –

+0

両方。私はより良い(もっときれいな、より効果的な)C++コードを学ぶコードを書いています。私は自分のコードを改善しようとしていますが、言語の「より深いアンダーサンド」を得ることも同様に重要です。関数へのポインタを使うことは、私にとってかなり有益であったと思われます。 – clearfix

答えて

1

このようなことを行うC++の方法は、関数ポインタを受け入れることではなく、という関数のようなオブジェクトを受け入れることです。

例:この例では

template <class T, class Cmp> int cmp(T x, T y, Cmp cmp_func = std::less) { 
    return cmp_func(x, y) - cmp_func(y, x); 
} 

我々は、それが二つのオペランドとoperator()をサポートとして、Cmpが正確に何を気にしません。

あなたの関数がfunction-like-objectを受け入れるならば、std::lessのような標準的なオブジェクトを使って自動的にこの問題を解決することができます。

+0

2つの関数を「大きく」と「小さく」することは、私がしたいことをしますが、実際に関数を記述する必要があることは私を悩ますものです。 float-operator>に直接アクセスする方法はありませんか? – clearfix