Случайное использование заглавных букв в строке [дубликаты]

Стефан Т. Лававей объясняет, почему это не работает в этом видео . В основном проблема заключается в том, что компилятор пытается вывести 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;
}

Пример Live на Ideone.

Другим возможным способом было бы не ограничивать тип функтора напрямую, а косвенно через SFINAE:

template
auto f(std::vector v, F fun)
    -> decltype(bool(fun(v[0])), void())
{
  // ...
}

Пример Live на Ideone.

Эта функция будет удалена из набора перегрузки, если fun не принимает аргумент типа T& или если тип возврата не конвертируется в bool. , void() делает тип возврата f void.

13
задан Konrad Rudolph 23 October 2018 в 15:11
поделиться