2016-10-13 3 views
1

Fooというオブジェクトがあり、そのメソッドはbool isChecked() constです。私にFoo foos[]があるとしましょう。選択したオブジェクトのインデックスを検索

私はfoosの正確に一つの要素は、isChecked()trueを返します。他のすべてのfalseを返すことを保証しています。

true要素のインデックスを見つけるための巧妙なC++ 03方法を探しています。私はこれをすることができますが、それはかなり醜いです。誰か良いものがありますか?

distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked))) 

#include <algorithm> 
#include <functional> 
#include <iostream> 
#include <iterator> 

using namespace std; 

#define SIZE 42 

class Foo{ 
    bool checked; 
public: 
    Foo() : checked(false) {} 
    void setChecked() { checked = true; } 
    bool isChecked() const { return checked; } 
}; 

int main() { 
    Foo foos[SIZE] = {}; 

    foos[13].setChecked(); 

    cout << distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked))) << endl; 
} 

Live Example

+0

それを示すためにあまりにも多くのコードではありませんあなたの質問に直接答えてください。 –

+0

@πάνταῥεῖええ、私はシンプルなエレガンスのために行っていましたが、あなたの権利はありません。問題のコードでそれを見るようになったので、それは単なる明確な質問です。 –

答えて

0

残念ながら、私の答えは巧妙ではなく、より重要なのは、あなたのユースケース(複数可)を合わないかもしれません。しかし、Fooコンテナを保持し、インデックスを保持するクラス(または構造体)を作成します。余分なint(またはインデックスに必要な型)を格納する必要がありますが、有効なオブジェクトの位置を計算する必要はありません。インスタンスのようなものについては

(またはあなたはFooのためだけでなく、それを使用したい場合は、あなたの要件に適合するか、テンプレートとコンテナのいずれかのタイプを持つ。):

class Foos { 
private: 
    int _index = -1; 
    Foo _foos[MAXSIZE] = {}; 
public: 
    Foos(int size, int index) 
    { 
     .... 
    } 
    int getIndex() 
    { 
     return _index; 
    } 
}; 

//... 
// then just call getIndex() when needed 
+0

これは私の現在のデザインがやっていることです。 (よく 'size_t index'変数があります。これは実際には' foos'に取り組んでいます。)これは実際には最良の解決策になるかもしれません:( –

+0

私はあまりにも遠くないとうれしいです。あなたが固定サイズではないが、それはあなたのユースケース/コンテキストにも依存します。 –

+0

サイズが固定されています。これは、「Foos」が確実にする責任を負うことになります一度に1つのアイテムしかチェックされていなかったので、一般的なケースではこれが好きで、これを受け入れる必要があると思います。これは私の実際の問題であるため、 //stackoverflow.com/questions/40028967/finding-a-wxmenus-selected-radio-item?noredirect=1&lq=1 –

関連する問題