вариади c лямбда с идеальной пересылкой - PullRequest
0 голосов
/ 01 мая 2020
/* The best way to implement lambda (with perfect forwarding) is: */

#include <iostream>
using namespace std;

void func(const char* s) {
    cout << s << endl;
}

// 1st implementation
template <typename... Args>
auto closure = [] (Args&&... args) {
    func(std::forward<decltype(args)>(args)...);
};

// 2nd implementation
auto variadic_lambda = [](auto&&... params) {
    func(std::forward<decltype(params)>(params)...);
};

int main() {
    closure<const char*>("Hello World");
    variadic_lambda("Hello World");
}

/*
 * 2nd implementation
 * struct SomeFunctionObject
 * {
 *     template <typename... Args>
 *     auto operator() (Args&&... args) const;
 * };
 */

При изучении лямбды C ++ 14 я наткнулся на два способа создания обобщенной лямбды c (с идеальной пересылкой). Я понимаю, что вторая реализация похожа на то, что я показал после main (). Но может ли кто-нибудь помочь мне разобраться в том, что такое первая реализация? Похоже, сам базовый класс замыкания является шаблоном? 1-я реализация также считается как variadi c lambda?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Первая реализация - это шаблон переменной, например:

template <typename... Args>
size_t x = sizeof...(Args);

Сама лямбда не является обобщенной c, для каждого экземпляра шаблона существует разные лямбда.

0 голосов
/ 01 мая 2020

Оба они эквивалентны. За исключением ниже.

Версия шаблона не может отображаться внутри области действия функции. Таким образом, он не может захватывать локальные переменные.

Для автоматической версии требуется c ++ 14 и выше, но шаблон работает на c ++ 11

...