Каков реальный тип в этой лямбда-функции? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть код, который объединяет 3 лямбда-функции:

#include <functional>
#include <iostream>
using namespace std;

template <typename F, typename G, typename H>
    auto concat(F f, G g, H h) {
    return [=](auto... parameters) {
        return f( g( h( parameters... ) ) );
    };
}

int main() {
    auto func1 (
        [](int i) {
            return (i * 2);
        }
    );

    auto func2 (
        [](int i) {
            return (i % 2);
        }
    );

    auto combined (
        concat(func1, func2, greater<int>{})
    );

    cout << combined(3, 2) << endl;

    return 0;
}

Мой вопрос: что является фактическим типом (F, G, H) в шаблоне? Это указатель на функцию, или функциональный объект, или что-то еще? Как я могу проиллюстрировать его тип в коде?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2020

С cppreference :

Лямбда-выражение является предварительным выражением уникального неименованного неагрегированного неагрегированного типа класса , известного как тип закрытия , который объявлен (для целей ADL) в наименьшей области блока, области класса или области пространства имен, которая содержит лямбда-выражение.

Другими словами, каждое лямбда-выражение имеет уникальный безымянный тип. F и G выводятся как тип лямбд, которые вы используете для создания экземпляра шаблона. Это не указатель на функцию.

В качестве иллюстрации вы можете считать, что лямбда-символы c являются сахаром для функторов. Ie соответствующий тип для func1 похож на

struct "no name" {
    auto operator()(int i) const {
        return (i * 2);
    }
);
3 голосов
/ 27 апреля 2020

Каждое лямбда-выражение имеет безымянный уникальный тип класса, и единственный способ обратиться к его типу - применить к нему decltype.

В данном конкретном экземпляре concat используются типы decltype(func1), decltype(func2) и greater<int> соответственно.
Тип результата decltype(concat(func1, func2, greater<int>{})).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...