C ++: Какой вариант использования Lambda для преобразования указателя на функцию? - PullRequest
0 голосов
/ 03 февраля 2020

Вы можете конвертировать лямбды в указатели функций. Каковы практические случаи использования для этого? Почему нам это надо?

Играть с ним

int main() {
    auto test = []() -> int { return 1; };
    using func_point = int (*)();
    func_point fp = test;
    return test();
}

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

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

Что касается вариантов использования, одним из важных вариантов использования является интеграция с C. Существует множество C API, которые позволяют регистрировать пользовательские обратные вызовы, обычно принимая один или несколько аргументов, например:

// Registers callback to be called with the specified state pointer
void register_callback(void (*callback)(void* state), void* state);

Вы можете связать состояние с экземпляром класса C ++ и преобразовать вызов обратного вызова в вызов метода:

class Foo
{
public:
    void method();
};

Foo foo;
register_callback([](void* p) { static_cast< Foo* >(p)->method(); }, &foo);
1 голос
/ 03 февраля 2020

Альтернативами указателям на функции являются параметры std :: function и template / generi c функторы. Все это влияет на ваш код по-разному.

Вы можете передавать лямбда-коды в код, который ожидает либо std :: function, generi c функторы, либо указатели на функции. Удобно иметь единую концепцию в вызывающем коде, которая бы согласованно поддерживала все эти различные концепции интерфейса, и, в конце концов, удобство - это все, лямбды - вот что. *

указатели на функции являются наименее универсальным понятием из приведенных выше, поэтому не каждую лямбду можно превратить в указатель на функцию. Предложение захвата должно быть пустым. Префикс лямбды с + явно преобразует их в указатель на функцию, если это возможно, т. Е. В следующем фрагменте f имеет тип int (*)( int ): auto f = +[]( int x ) { return x; };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...