У меня есть класс, который должен фильтровать его содержимое в соответствии с предоставленным пользователем предикатом. Интерфейс, который мне дан, предписывает брать ссылку на предикат:
class Test {
vector<int> data;
public:
template <class PREDTYPE>
void filter(PREDTYPE& pred) {
return;
}
};
Мне также дается фрагмент кода теста, который выглядит примерно так:
class Filter {
public:
bool operator()(int) const {
return false;
}
};
int main() {
Test test;
test.filter(Filter());
}
Это не компилируется, говоря cannot bind non-const lvalue reference of type 'Filter&' to an rvalue of type 'Filter'
. Если я изменю код тестирования на
int main() {
Test test;
Filter filter;
test.filter(filter);
}
это работает, но это зависит от конечного пользователя, и я не могу контролировать его поведение. Я попытался перегрузить метод filter, создав версию, которая будет принимать предикат по значению, а затем передавать его по ссылке, но это также не компилируется с сообщением call of overloaded 'filter(Filter&)' is ambiguous
.
Отсюда мой вопрос: возможно ли построить фильтр, который бы принимал и r-значения, и l-значения предиката?