Стефан Т. Лававей объясняет, почему это не работает в этом видео . В основном проблема заключается в том, что компилятор пытается вывести BaseT
из как параметр std::vector
, так и std::function
. Лямбдой в C ++ является , а не типа std::function
, это неназванный, уникальный неединичный тип, который можно конвертировать в указатель функции, если у него нет списка захвата (empty []
) , С другой стороны, объект std::function
может быть создан из любого возможного типа вызываемого объекта (указатели функций, указатели функций-функций, объекты функций).
Обратите внимание, что я лично не понимаю, почему вы хотите ограничить входящие функторы этой специфической сигнатурой (в дополнение к тому факту, что косвенность через оболочку полиморфной функции, например std::function
, намного более неэффективна, чем прямой вызов функтора (который может даже быть встроенным)), но вот рабочая версия. В принципе, он отключает дедукцию аргумента на части std::function
и выводит BaseT
из аргумента std::vector
:
template
struct Identity{
typedef T type;
};
template
vector findMatches(vector search,
typename Identity>::type func)
{
vector tmp;
for(auto item : search)
{
if( func(item) )
{
tmp.push_back(item);
}
}
return tmp;
}
Другим возможным способом было бы не ограничивать тип функтора напрямую, а косвенно через SFINAE:
template
auto f(std::vector v, F fun)
-> decltype(bool(fun(v[0])), void())
{
// ...
}
Эта функция будет удалена из набора перегрузки, если fun
не принимает аргумент типа T&
или если тип возврата не конвертируется в bool
. , void()
делает тип возврата f
void
.