У меня есть этот заголовок метода:
void Find(const _T & v, int max, const function<bool(const _E &)> & filter)
Я использую std::function
, потому что мне нужно принять указатель функции, функтор или лямбда-выражение.Я хотел бы, чтобы фильтр был необязательным, и по умолчанию для функции, которая всегда возвращает true (ничего не фильтруется) в качестве параметра по умолчанию.Я пробовал что-то вроде этого:
#include <functional>
template <typename E>
bool alwaystrue(const E & e){ return true; }
template <typename T, typename E>
void Find(const T & v, int max,
const std::function<bool(const E &)> & filter = alwaystrue);
int main()
{
Find<int, int>(1, 2);
}
Но это не компилируется:
50016981.cpp: In function ‘void Find(const T&, int, const std::function<bool(const E&)>&) [with T = int; E = int]’:
50016981.cpp:11:24: error: cannot resolve overloaded function ‘alwaystrue’ based on conversion to type ‘const std::function<bool(const int&)>&’
Find<int, int>(1, 2);
^
Я также пытался использовать функцию внутри своего класса, но получил похожую ошибку.
Есть ли проблема в сочетании с std::function
с шаблонами?И если да, не могли бы вы подсказать, как делать то, что я хочу?Я хочу избежать перегрузки функции Find()
(если это возможно), поэтому у меня нет дублирующего кода.