std :: function с функцией в качестве параметра по умолчанию - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть этот заголовок метода:

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() (если это возможно), поэтому у меня нет дублирующего кода.

1 Ответ

0 голосов
/ 25 апреля 2018

Вам необходимо указать, какой экземпляр alwaystrue вы хотите использовать по умолчанию, т.е. alwaystrue<E>:

template <typename T, typename E>
void Find(const T& v, int max,
          const std::function<bool(const E&)>& filter = alwaystrue<E>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...