Un delegado en C es una construcción de programación que le permite pasar un puntero de función como argumento. Esto le permite crear devoluciones de llamada que se pueden invocar de forma asincrónica o en diferentes contextos.
Existen varios enfoques para implementar delegados en C, que incluyen:
Los functores son objetos que definen una función operator(), haciéndolas efectivamente invocables.
struct Functor { int operator()(double d) { return (int)d 1; } };
Las expresiones Lambda proporcionan una sintaxis concisa para crear delegados en línea:
auto func = [](int i) -> double { return 2 * i / 1.15; };
Los punteros de función directos se pueden utilizar para representar delegados:
int f(double d) { ... } typedef int (*MyFuncT)(double d);
Los punteros a funciones miembro proporcionan una forma rápida de crear delegados para los miembros de la clase:
struct DelegateList { int f1(double d) { } int f2(double d) { } }; typedef int (DelegateList::* DelegateType)(double d);
std::function es una plantilla C estándar que puede almacenar cualquier invocable, incluidos lambdas, functores, y punteros de función.
#includestd::function f = [any of the above];
El enlace le permite aplicar parcialmente argumentos a un delegado, haciéndolo conveniente para llamar a funciones miembro:
struct MyClass { int DoStuff(double d); // actually (MyClass* this, double d) }; std::functionf = std::bind(&MyClass::DoStuff, this, std::placeholders::_1);
Las plantillas pueden aceptar cualquier invocable que coincida con la lista de argumentos:
templateint DoSomething(FunctionT func) { return func(3.14); }
Los delegados son una herramienta versátil en C que le permite mejorar la flexibilidad y la capacidad de mantenimiento de su código. Al elegir el enfoque de delegado adecuado para sus necesidades específicas, puede pasar funciones como parámetros de manera efectiva, manejar devoluciones de llamadas e implementar programación asincrónica en C.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3