Данный объект Foo
у которого есть метод bool isChecked() const
, Допустим, у меня есть Foo foos[]
,
Я гарантированно, что ровно один элемент foos
вернусь true
на isChecked()
все остальные вернутся false
,
Я ищу умный C ++ 03 способ найти индекс true
элемент. Я могу сделать это, но это довольно уродливо. У кого-нибудь есть что-нибудь получше?
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;
}
К сожалению, мой ответ не является умным, и что более важно, может не соответствовать вашим вариантам использования. Но я бы создал класс (или структуру), который будет содержать ваш контейнер 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
Других решений пока нет …