Вызываете нестатическую функцию как предикат? - PullRequest
0 голосов
/ 19 мая 2018

Я хотел бы использовать функцию, которая не является статической, в качестве предиката.К сожалению, я получаю сообщение об ошибке, что оно нестатично, и я не знаю, как к этому подойти.

Ошибка :

ошибка: вызов нестатической функции-члена без аргумента объекта songs_.remove_if (Song :: operator () (s));

Вот нестатическая функция, которую я использую в сочетании с remove_if:

bool Song::operator()(const Song& s) const 
{
    SongCallback();
    string thisArtist = Song::artist_;
    string thisTitle = Song::title_;

    // check if songs match title AND artists
    if(Song::operator==(s))
    {
        return true;
    // wild card artist or title
    }
    else if(thisArtist == "" || thisTitle == "")
    {
        return true;
    // either artist or title match for both songs
    // }
    // else if(thisArtist == s.GetArtist() or thisTitle == s.GetTitle()){
    //     return true;
    // no matches
    }
    else
    {
        return false;
    } 
}

, а в другой функции я пытаюсь вызвать remove_if, используя эту функциюкак предикат, например, так:

Song s = Song(title,artist);
songs_.remove_if(s.operator()(s) );

Итак, мой вопрос: как мне правильно вызвать этот оператор, чтобы он не жаловался на то, что это нестатическая функция?Я где-то читал об указателе на экземпляр класса, но это самое близкое, что я мог найти.

1 Ответ

0 голосов
/ 19 мая 2018

Попробуйте это:

Song s(title, artist);
songs_.remove_if([&s](const Song& x) { return x(s); });

Однако довольно странно делать логику сравнения перегруженным оператором вызова функции.Если бы мне пришлось угадывать, я бы сказал, что вы, вероятно, могли бы придумать более чистый дизайн, например:

songs_.remove_if([&s](const Song& x) {
    return laxly_equal_with_callback(x, s);
});
...