Имеем класс, работающий с двумерным массивом объектов. У класса есть ряд методов типа bool (*)(const int x, const int y), которые возвращают всякие флаги относительно состояний объектов массива. Хочу написать метод, в котором перебираются области массива заданной формы, но универсальный. Для этого хотел в качестве параметра последнего метода передать указатель на метод вышеуказанного типа, однако GCC этого делать не даёт, указывает на несоответствие типов. В коде попытка моего решения выглядит примерно так
typedef bool (*checker)(const int x, const int y);
class field
{
...
public:
...
bool somecheck1(const int x, const int y);
bool somecheck2(const int x, const int y);
...
int calcaround(const int x, const int y, checker cf);
...
void somefunc();
}
...
int field::calcaround(const int x, const int y, checker cf)
{
...
bool res = cf(x, y);
...
}
...
void field::somefunc()
{
...
int z1 = this->calcaround(x, y, this->somecheck1);
int z2 = this->calcaround(x, y, this->somecheck2);
...
}
Компилятор упирает на несоответствие типов. Т.е. тип checker не совпадает с типом методов класса. Явное преобразование (checker)this->somecheck1 также вызывает ошибку. Мне кажется, что методу класса на стадии компиляции добавляются всякие параметры вроде того же this, явно в коде не указанные.
Как разрешается подобный случай?
Страуструп у меня старый, второй редакции - там подобный случай не рассмотрен. Там предлагается либо объекты передавать в качестве параметра, либо использовать обычные функции (не методы класса). Один раз я с подобной ситуацией сталкивался, и вышел из неё, использовав friend функции, но это некрасиво. Порождать кучу классов, не несущих никакого смысла, чтобы не передавать указатель на метод - это загромождает код. Создать некий enum, а в универсальном методе по switch выбирать нужный метод - терпимо, но черевато переписыванием универсального метода при каждом изменении числа методов проверки объекта - не хотелось бы.
Кто что скажет?