Функция из более высокого порядка, примененная к массиву

У меня есть вектор определенного типа класса;

vector<Song> database;

а также

class Song
{
public:
string getName() const;
string getSinger() const;
unsigned int getLength();
unsigned short getYear() const;

private:
char singer[51];
char name[51];
unsigned int length;
unsigned short year;
};

Обратите внимание, что вектор не входит в класс Song. Это в другом классе. В этом другом классе я создал функцию более высокого порядка. Одним из параметров этой функции является метод получения из класса Song:

void order(string, int, Song*, unsigned int (Song::*get)(), bool(*compare)(unsigned int, unsigned int));

Однако, когда я звоню так:

database[a].(obj->*get())

Я понимаю, что когда мне приходится иметь дело с функциями из других классов, я должен дать ссылку на объект этого класса, а также дать ссылку на функцию из этого класса. У меня вопрос, могу ли я передать ссылку на функцию, которая автоматически обнаружит объект, с которым я работаю?

РЕДАКТИРОВАТЬ

void Interface::order(string command, int findLength,
Song* obj, unsigned int (Song::*get)(), bool(*compare)(unsigned int first, unsigned int second))
{
for (unsigned int a = 0; a < database.size(); a++)
{
if (compare(database[a].(obj->*get)(), stoi(command)))
{
cout << "Deleting found match...\n";
database.erase(database.begin() + a);
}
}
}

Я получаю ошибку в database[a].(obj->*get)()
Ошибка в том, что компилятор ожидал имя члена. Тем не менее, я хочу дать функцию, которая не зависит от объекта, который я передал. Другими словами, я спрашиваю, существует ли тип конструкции, который позволяет мне передавать здесь одну функцию в качестве параметра, и эта функция будет автоматически вызывать каждый объект [из вектора песен] и соответствующий ему метод получения.

1

Решение

Вы правы насчет ->* синтаксис для доступа к функциям-членам через указатель на функцию-член: это синтаксис, когда у вас есть указатель на объект.

Существует другой синтаксис для доступа к функции-члену через объект-член:

(database[a].*get)()

Это вызвало бы функцию-член, на которую указывает get на Song объект в database[a],

1

Другие решения