`

What is a C++ delegate?

    博客分类:
  • c++
 
阅读更多

 转自:http://stackoverflow.com/questions/9568150/what-is-a-c-delegate

 

Option 1 : functors:

A function object may be created by implementing operator()

struct Functor
{
     // Normal class/struct members

     int operator()(double d) // Arbitrary return types and parameter list
     {
          return (int) d + 1;
     }
};

// Use:
Functor f;
int i = f(3.14); 

Option 2: lambda expressions (C++11 only)

// Syntax is roughly: [capture](parameter list) -> return type {block}
// Some shortcuts exist
auto func = [](int i) -> double { return 2*i/1.15; };
double d = func(1);

  Option 3: function pointers

int f(double d) { ... }
typedef int (*MyFuncT) (double d);
MyFuncT fp = &f;
int a = fp(3.14);

 Option 4: pointer to member functions (fastest solution)

See Fast C++ Delegate (on The Code Project).

struct DelegateList
{
     int f1(double d) { }
     int f2(double d) { }
};

typedef int (DelegateList::* DelegateType)(double d);

DelegateType d = &DelegateList::f1;
DelegateList list;
int a = (list.*d)(3.14);

 Option 5: std::function

(or boost::function if your standard library doesn't support it). It is slower, but it is the most flexible

#include <functional>
std::function<int(double)> f = [can be set to about anything in this answer]
// Usually more useful as a parameter to another functions

 Option 6: binding

Allows setting some parameters in advance, convenient to call a member function for instance

struct MyClass
{
    int DoStuff(double d); // actually a DoStuff(MyClass* this, double d)
};

std::function<int(double d)> f = std::bind(&MyClass::DoStuff, this, std::placeholders::_1);
// auto f = std::bind(...); in C++11

 Option 7: templates

Accept anything as long as it matches the argument list.

template <class FunctionT>
int DoSomething(FunctionT func)
{
    return func(3.14);
}

 

分享到:
评论

相关推荐

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    C++实现delegate

    用C++做项目的时候,尤其是写客户端的时候经常会有事件回调的设计,一般的方式是使用虚函数表,用一个虚基类包含...但这种方式和C++11的lamda不兼容,为了更方便的实现事件回调机制,使用delegate是很不错的一种方式。

    C++下实现委托的代码

    在C++编程中,"委托"(Delegate)的概念源自于其他一些编程语言,如C#或Java,但在C++标准库中并没有内置的委托机制。然而,通过一些编程技巧,我们可以模拟实现类似的功能。委托通常用于传递函数或者方法作为参数,...

    iOS Delegate传值通俗理解

    delegate?.setValue(value: value) } ... } ``` 当SenderViewController调用`sendValue`时,它会通过Delegate向ReceiverViewController发送值。在ReceiverViewController的`setValue`方法中,我们可以接收到这个...

    简单的delegate实现

    在iOS开发中,Delegate是一种非常重要的设计模式,它允许对象之间进行通信,特别是当一个对象(委托者)需要通知另一个对象(委托对象)某些事件发生时。本文将深入讲解“简单的Delegate实现”,并以实际代码为例,...

    iPhone编程delegate示例

    在Objective-C中,`delegate`是一种关键的编程模式,用于实现对象间的通信。本文将深入探讨如何在iPhone编程中使用`delegate`,并以一个名为"MyDelegateSample"的示例项目来说明。 首先,`delegate`是Objective-C中...

    ios delegate传值

    delegate?.didReceiveValue(value: yourValue) ``` 4. 实现协议: 在A页面(假设为`AViewController`),需要实现`BToAProtocol`,并设置自身为B页面的Delegate: ```swift class AViewController: ...

    IOS 利用Delegate传值

    delegate?.receivedData(data) } ``` 五、处理接收到的数据 5. 在实现协议的类中,重写`receivedData:`方法以处理接收到的数据: ```objc - (void)receivedData:(id)data { NSLog(@"Received data: %@", data); ...

    iOS学习笔记3---delegate五步曲,轻松学会使用delegate

    在iOS开发中,Delegate是一种非常重要的设计模式,它允许对象之间进行通信,使得一个对象能够对另一个对象的行为进行响应。本篇文章将通过“delegate五步曲”,帮助你深入理解并熟练掌握如何在iOS应用中使用Delegate...

    IOS源码之页面之间数据传送(通过delegate)

    在Page A中,我们需要创建一个`PageB`的对象,并将其`delegate`属性设置为Page A自身。这通常在`prepare(for:sender:)`方法中完成,因为这是在页面跳转前被调用的: ```swift override func prepare(for segue: ...

    Delegate 小Demo

    在.NET框架中,Delegate是事件处理和回调机制的关键组成部分,它代表了一组方法的签名,允许我们传递方法作为参数或创建方法的组合。这个“Delegate小Demo”显然是一个用于学习和复习Delegate用法的示例项目。让我们...

    IOS开发delegate Demo

    delegate?.performAction() } ``` 这个"IOS开发delegate Demo"可能包含了一个简单的场景,例如,当用户点击按钮时,ViewController作为Delegate接收到通知并执行相应操作。实践中,Delegate可以用来处理各种交互,...

    delegate 使用 xcode iOS

    delegate?.handleAction(data: data) } } ``` 4. **连接代理**:在Xcode中,使用Interface Builder或在代码中设置委托,确保发送者和接收者之间的联系。 ```swift // 在 storyboard 中 senderViewController....

    C# Delegate小例子

    在这个"C# Delegate小例子"中,我们将深入探讨Delegate的概念、使用方式以及它在实际编程中的应用。 1. **Delegate概念**: Delegate在C#中是一种类,它代表对方法的引用。这种引用是类型安全的,意味着在编译时就...

    Delegate小Demo

    在.NET框架中,Delegate是类型安全的函数指针,它允许我们引用方法并像操作对象一样操作它们。Delegate是事件处理、回调函数和多播委托等核心编程概念的基础。在这个"Delegate小Demo"中,我们将深入理解Delegate的...

    代理delegate_execute.exe

    delegate_execute.exe

    CLI/C++反射机制交互C#、C++

    5. **反射调用**:通过`Type.GetMethod`获取接口中对应的方法信息,然后使用`Delegate.CreateDelegate`创建一个委托,最后通过委托来执行实际的方法调用。 在实际应用中,效率是一个关键因素。由于反射在运行时动态...

    利用delegate进行ViewController之间的参数传递

    delegate?.didReceiveData(data) } } ``` ```objective-c @interface SenderViewController : UIViewController @property (nonatomic, weak) id&lt;DataTransferDelegate&gt; delegate; - (void)sendData; @end @...

    使用Delegate在两个ViewController间传值

    delegate?.didReceiveValue(valueToPass) } ``` ```objective-c - (void)sendValue { id valueToPass = @"传递的数据"; [self.delegate didReceiveValue:valueToPass]; } ``` 与Android的`onActivityResult`...

    delegate一对多

    在iOS和macOS开发中,`delegate`模式是一种常见的设计模式,用于实现对象间的通信。在标题"delegate一对多"中,"一对多"指的是一个委托(delegate)对象可以同时处理多个其他对象的请求或事件。这种模式尤其在UI组件...

Global site tag (gtag.js) - Google Analytics