Разбор лямбда-функции с использованием шаблонов - PullRequest
1 голос
/ 04 июня 2019

Я довольно новичок в C ++, и в настоящее время я пытаюсь узнать, как использовать шаблон для лямбда-функции.

Лямбда можно увидеть в функции main, и она просто делает логическое значениеcheck.

Реализация ниже работает, но я должен явно указать типы лямбда-функции в функции testing, как видно из входного параметра.

void testing(std::function<bool(const int& x)> predicate){
    auto a = predicate(2);
    std::cout << a << "\n";
}

int main() {
    int ax = 2;
    testing([&ax](const int& x) { return x == ax;});
}

Я хочу, чтобыреализация, в которой я могу использовать шаблоны, как показано ниже, но я не могу заставить что-либо работать.

template <typename T>
void testing(std::function<bool(const T& x)> predicate){
    auto a = predicate(2);
    std::cout << a << "\n";
}

Есть ли общий способ использовать шаблон для лямбд?

1 Ответ

5 голосов
/ 04 июня 2019

Не переносите параметр шаблона в std::function.

Лучший способ передать лямбда-функцию в функцию - это просто использовать ее в качестве неограниченного параметра шаблона:

template<class F>
void testing(F predicate) {
    auto a = predicate(2); 
    std::cout << a << '\n';
}

int main() {
    int ax = 2;
    testing([ax](int x) { return x == ax; }); 
}

Преимущества над std::function.

  • std::function выделяет пространство в куче для хранения функтора
  • std::function имеет служебную нагрузку, аналогичную вызову виртуальной функции
  • std::function не может быть встроен компилятором, но тривиально встроить лямбду, которая передается напрямую
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...