调用非静态函数作为谓词?
Calling a Non-Static function as Predicate?
我想使用一个非静态函数作为谓词。不幸的是,我收到一个错误,抱怨它是非静态的,我不确定如何处理这个问题。
错误:
error: call to non-static member function without an object argument
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) );
所以我的问题是,如何正确地调用这个运算符,而不会抱怨它是一个非静态函数?我在某处读到过有关指向 class 实例的指针,但那是我能找到的最接近的东西。
试试这个:
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);
});
我想使用一个非静态函数作为谓词。不幸的是,我收到一个错误,抱怨它是非静态的,我不确定如何处理这个问题。
错误:
error: call to non-static member function without an object argument 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) );
所以我的问题是,如何正确地调用这个运算符,而不会抱怨它是一个非静态函数?我在某处读到过有关指向 class 实例的指针,但那是我能找到的最接近的东西。
试试这个:
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);
});