2012-06-19 3 views
0

Я не использую библиотеки boost. Как я могу это сделать с помощью STL?Использование find_if для вектора объектов

class Files 
{ 

private: 
    bool isSame(FileID f1, FileId f2) 
    { 
     if(f1.getId()==f2.getId()) 
     return true; 
     return false; 
    } 

public: 
    vector<FileId> mod_files; 

    void update() 
    { 
     FildId f = getFileId(); 
     vector<FildId>::const_iterator found = find_if(mod_files.begin(), mod_files.end(),   ???); 
    } 

}; 

Я хотел бы передать isSame в качестве третьего аргумента функции find_if и связать «F» на второй аргумент isSame в.

+0

Я думаю, что вы хотите, чтобы ваш частные и коммутируемым. таким образом вы можете вызвать «isSame» извне класса. –

ответ

4

В C++ 11 это просто:

std::bind(&Files::isSame, this, f); 

В старые добрые C++ 03 нет mem_fun, которая принимает 2 аргумента, так что вы должны сделать привязку самостоятельно :

class is_same_pred 
{ 
public: 
    // unary function typedefs 

    explicit is_same_pred(Files& files, FileId f1) : _files(files), _f1(f1) {} 

    bool operator()(FileId f2) const { return _files.isSame(_f1, f2); } 

private: 
    Files& _files; 
    FileId _f1; 
}; 

Где isSame доступна is_same_pred, а затем использовать его как это:

is_same_pred(this, f); 

Все, что сказано и сделано, вы бы лучше определение isSame как статического или свободной функция:

bool isSame(FileId f1, FileId f2){ ... } 

std::bind1st(std::ptr_fun(&isSame), f); 
+0

Как раз для того, чтобы бросить мои два цента, я думаю, как только мы займемся написанием собственных предикатов или попыткой сделать что-то с помощью bind1st, mem_fun и т. Д .: пришло время подумать о том, чтобы отпустить find_if и просто написать простой старый цикл поиска ванили, все привыкли делать. Если у нас нет инструментов (например, C++ 11/boost) и опыта, необходимого для того, чтобы генерические алгоритмы свободно и естественно вытекали из наших кончиков пальцев, я думаю, их следует избегать. Если это дает нам головные боли, чтобы написать его в первую очередь, большинство людей, вероятно, не захотят его отлаживать. – stinky472

+0

+1 для указания, что isSame не имеет преимуществ, являющихся нестатическим методом, и я бы хотел дать еще один +2, указав, что то, что он хочет делать точно так, как он делает это, невозможно в C++ 03, используя только mem_fun (nullary to unary, not binary to ternary) и привязки STL – stinky472